Flutter:如何制作一个始终滚动到底部的列表?

Dan*_*ira 4 flutter

我正在尝试制作一个基本上是日志屏幕的列表。也就是说,我需要列表一直滚动到底部。

如何做到这一点?

M. *_*ard 18

reverse: trueListView小部件上设置并反转子列表。

ListView(
  // Start scrolled to the bottom by default and stay there.
  reverse: true,
  children: widget.children.reversed.toList(growable: false),
),
Run Code Online (Sandbox Code Playgroud)

如果您有一个很长的列表并且反转很昂贵,您可以使用 ListView.builder 反转索引而不是整个列表

ListView.builder(
    reverse: true,
    itemCount: items.length,
    itemBuilder: (context, index) {
      final reversedIndex = items.length - 1 - index;
      final item = items[reversedIndex];
      return MyWidget(item);
    }
)
Run Code Online (Sandbox Code Playgroud)

我从上面 Günter 的评论中得到了这个。谢谢!

  • 添加了有关如何使用“ListView.builder”来完成相同任务的编辑 (2认同)

小智 12

我发现WidgetsBinding.instance.addPostFrameCallback非常有用,尤其是在这种需要一些后期构建处理的情况下。在这种情况下,它解决了以下问题:

  1. 定义滚动控制器
final ScrollController _sc = ScrollController();
Run Code Online (Sandbox Code Playgroud)
  1. 在 ListView 构建器中添加语句:
WidgetsBinding.instance.addPostFrameCallback((_) => {_sc.jumpTo(_sc.position.maxScrollExtent)});
Run Code Online (Sandbox Code Playgroud)
  1. 将控制器添加到ListView参数:
controller: _sc,
Run Code Online (Sandbox Code Playgroud)

我还在构建一个记录器查看器。奇迹般有效。

  • 对我来说,我认为这应该被标记为正确答案。每当构建列表时,它都会显示列表的底部。不需要计时器。 (2认同)

Dan*_*ira 9

我可以通过使用来完成这项工作,Timer但可能应该有更好的方法来做到这一点。我的解决方法是:

  1. 定义 aScrollController()并将其附加到 listView:
ListView.builder(
      controller: _scrollController,
      itemCount: _logLines.values.length,
      itemBuilder: (context, index) => _getLogLine(index),
    )
Run Code Online (Sandbox Code Playgroud)
  1. 覆盖您的页面initState方法并在其中设置一个计时器,如下所示:
 @override
  void initState() {
      super.initState();
      Timer.periodic(Duration(milliseconds: 100), (timer) {
        if (mounted) {
            _scrollToBottom();
        } else {
          timer.cancel();
        }
      });
    }
Run Code Online (Sandbox Code Playgroud)
  1. 定义一个方法_scrollToBottom()来调用:

    _scrollController.jumpTo(_scrollController.position.maxScrollExtent);