flutter - 以编程方式滚动到 ListView 的末尾

我有一个可滚动的 ListView,其中项目的数量可以动态变化。每当将新项目添加到列表末尾时,我想以编程方式将 ListView 滚动到末尾。 (例如,可以在末尾添加新消息的聊天消息列表)

我的猜测是我需要在我的 State 对象中创建一个 ScrollController 并将其手动传递给 ListView 构造函数,所以我以后可以在 Controller 上调用 animateTo()/jumpTo() 方法。但是,由于我无法轻松确定最大滚动偏移量,因此似乎不可能简单地执行 scrollToEnd() 类型的操作(而我可以轻松传递 0.0 使其滚动到初始位置)。

有没有简单的方法来实现这一点?

使用 reverse: true 对我来说不是一个完美的解决方案,因为当 中只有少量项目时,我希望项目在顶部对齐ListView 视口(viewport)。

最佳答案

截图:

  1. 用动画滚动:

    final ScrollController _controller = ScrollController();
    
    // This is what you're looking for!
    void _scrollDown() {
      _controller.animateTo(
        _controller.position.maxScrollExtent,
        duration: Duration(seconds: 2),
        curve: Curves.fastOutSlowIn,
      );
    }
    
    @override
    Widget build(BuildContext context) {
      return Scaffold(
        floatingActionButton: FloatingActionButton.small(
          onPressed: _scrollDown,
          child: Icon(Icons.arrow_downward),
        ),
        body: ListView.builder(
          controller: _controller,
          itemCount: 21,
          itemBuilder: (_, i) => ListTile(title: Text('Item $i')),          
        ),
      );
    }
    
  2. 无动画滚动:

    将上面的 _scrollDown 方法替换为:

    void _scrollDown() {
      _controller.jumpTo(_controller.position.maxScrollExtent);
    }
    

https://stackoverflow.com/questions/43485529/

相关文章:

android - 即使屏幕关闭,如何在后台运行代码?

dart - Flutter 中的多行文本字段

android - Flutter Pub : Expected a key while parsi

flutter - 如何更改 CircularProgressIndicator 的颜色

android - Visual Studio Code - URI 目标不存在 'package:

flutter - 如何从我的 Flutter 代码中打开 Web 浏览器 (URL)?

flutter - 将数据传递给 StatefulWidget 并在 Flutter 中以它的状态访

firebase - 类型 'List' 不是类型 'List'

flutter - 如何在 Flutter 中停用或覆盖 Android "BACK"按钮?

flutter - 如何使应用栏的标题居中