Flutter - 如何一直滚动到 ListView 的底部?

bus*_*suu 7 mobile android ios dart flutter

我使用这段代码来滚动:

WidgetsBinding.instance?.addPostFrameCallback((_) => _scrollToEnd());
Run Code Online (Sandbox Code Playgroud)

_scrollToEnd()方法是:

_scrollController.animateTo(
  _scrollController.position.maxScrollExtent,
  duration: const Duration(
    milliseconds: 200,
  ),
  curve: Curves.easeInOut,
);
Run Code Online (Sandbox Code Playgroud)

将其想象为一个普通的聊天屏幕。如果消息在 1 行中,它会滚动到裸露的底部。但是,一旦消息达到 2 行以上,它就不会一直滚动到底部。消息的行数越多,滚动到底部的次数就越少。

这是我进入聊天时的样子:

但如果我进一步向下滚动,这就是聊天的底部:

我注意到还有一种情况:

  1. 我进入聊天。
  2. 它像第一张图片一样向下滚动。
  3. 如果我点击屏幕上的任意位置,它会继续滚动到列表视图的裸露底部,就像第二张图片一样。

为什么会发生这种情况以及如何解决这个问题?

小智 11

我所做的,使用 listView 并反向 true 并在儿童中使用 map.reversed 列表,我在下面给你我的代码示例。

ListView(
          reverse: true,
          children: controller.listMessageData.reversed
           .map((e) => Container(child: Text(e.title));
Run Code Online (Sandbox Code Playgroud)


Kau*_*dru 10

只是一个解决方法,但它应该按预期工作。在列表视图中使用夹紧物理。在最大范围内添加额外的数字

 _scrollController.animateTo(
 _scrollController.position.maxScrollExtent+300,
 duration: const Duration(
   milliseconds: 200,
  ),
  curve: Curves.easeInOut,
  );
Run Code Online (Sandbox Code Playgroud)


bus*_*suu 10

我终于找到了解决办法。所有答案都不适合我,或者部分有效,但我感谢您尝试回答。

对我来说,我所要做的就是把

reverse: true
Run Code Online (Sandbox Code Playgroud)

在 ListView 构建器中,然后每当您返回消息时,您需要将其返回为:

return messages[messages.length - 1 - index];
Run Code Online (Sandbox Code Playgroud)

这是最重要的部分。