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

标签 flutter flutter-layout flutter-animation

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

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

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

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

最佳答案

截图:

enter image description here

  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);
    }
    

关于flutter - 以编程方式滚动到 ListView 的末尾,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43485529/

相关文章:

flutter - 选择一个文件并使用 Flutter Web 通过 POST 发送

flutter - 如何在flutter中创建完全水平滚动的垂直列表

flutter - 问题 SingleChildScrollView 与 PageView flutter

flutter - 每当页面在屏幕上时如何重新加载页面 - flutter

flutter - 在点击功能时出现此错误以在对话框中查看图像

flutter - 在Flutter中,为什么有些动画类需要vsync而有些则不需要?

flutter - 单击其他元素时触发可见性窗口小部件抖动

flutter - 火焰组件(flutter Flame)可以作为 Flutter 应用程序中的小部件吗?

dart - 我怎样才能每 1 秒运行一次这个 setState 函数

flutter - 动画期间按钮宽度不变