【问题标题】:Control the scroll of Flutter ListView控制 Flutter ListView 的滚动
【发布时间】:2020-11-27 23:52:32
【问题描述】:

我想实现ListView的自动滚动功能,但不知道如何正确控制。

我有 2 个按钮。一种会使 ListView 开始滚动到底部,另一种会使 ListView 停止滚动。

我知道我可以使用 ScollController 和 animateTo 自动滚动到底部,但我不知道如何停止。这是实现自动滚动功能的正确方法吗?如果是,那么我该如何停止滚动?

【问题讨论】:

    标签: flutter dart


    【解决方案1】:

    在您的控制器中,您可以定义动画,包括要滚动的像素数以及从当前位置到列表中的目的地所需的时间。例如:

    _controller.animateTo(pixelsToMove,
     curve: Curves.linear, duration: Duration (milliseconds: 500));
    

    如果要使用此控制器功能,可以添加ScrollNotification,并在滚动结束时不断调用它,直到按下停止按钮。

    【讨论】:

      【解决方案2】:

      您可以通过将animateTo 覆盖到当前位置来停止滚动,如下所示

         _scrollController.animateTo(_scrollController.offset,
                          duration: Duration(milliseconds: 5000),
                          curve: Curves.fastOutSlowIn);
      

      查看以下示例

      import 'package:flutter/material.dart';
      
      void main() {
        runApp(new MyApp());
      }
      
      class MyApp extends StatelessWidget {
        @override
        Widget build(BuildContext context) {
          return new MaterialApp(
            title: 'Example',
            home: new MyHomePage(),
          );
        }
      }
      
      class MyHomePage extends StatefulWidget {
        @override
        _MyHomePageState createState() => new _MyHomePageState();
      }
      
      class _MyHomePageState extends State<MyHomePage> {
        ScrollController _scrollController = new ScrollController();
      
        @override
        Widget build(BuildContext context) {
          return new Scaffold(
            body: ListView.builder(
              controller: _scrollController,
              itemCount: 50,
              itemBuilder: (_, index) =>
                  ListTile(title: Text('ListTile ' + index.toString())),
            ),
            bottomSheet: Row(
              mainAxisAlignment: MainAxisAlignment.spaceEvenly,
              children: [
                RaisedButton(
                  child: Text("Start Down"),
                  onPressed: () {
                    setState(() {
                      _scrollController.animateTo(
                          _scrollController.position.maxScrollExtent,
                          duration: Duration(milliseconds: 5000),
                          curve: Curves.fastOutSlowIn);
                    });
                  },
                ),
                RaisedButton(
                  child: Text("Stop"),
                  onPressed: () {
                    setState(() {
                      _scrollController.animateTo(_scrollController.offset,
                          duration: Duration(milliseconds: 5000),
                          curve: Curves.fastOutSlowIn);
                    });
                  },
                )
              ],
            ),
          );
        }
      }
      
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-07-11
        • 1970-01-01
        • 2020-12-30
        • 2019-06-19
        • 2022-01-25
        • 1970-01-01
        • 2021-11-15
        • 1970-01-01
        相关资源
        最近更新 更多