Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/flutter/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Flutter 颤振:如何避免在ListView.builder中自动滚动_Flutter_Listview - Fatal编程技术网

Flutter 颤振:如何避免在ListView.builder中自动滚动

Flutter 颤振:如何避免在ListView.builder中自动滚动,flutter,listview,Flutter,Listview,我正在构建一个聊天应用程序,我已经达到了创建实际聊天界面的阶段。我决定使用ListView.builder()构造函数,因为我正在处理大量的数据(消息)。布局和我的代码大体上是这样的 我希望在任何时候都保持滚动位置,除非用户明确地滚动离开。第一个问题来了:当软件键盘出现时,或者输入字段的大小改变时,我希望消息区域的底部保持可见,旧的(即上面的)消息被推出屏幕。你知道,它在Messenger中的工作方式,等等。但是,它不是那样工作的。较旧的消息保持可见,而较新的消息则会被推送 为了实现这一点,我尝

我正在构建一个聊天应用程序,我已经达到了创建实际聊天界面的阶段。我决定使用
ListView.builder()
构造函数,因为我正在处理大量的数据(消息)。布局和我的代码大体上是这样的

我希望在任何时候都保持滚动位置,除非用户明确地滚动离开。第一个问题来了:当软件键盘出现时,或者输入字段的大小改变时,我希望消息区域的底部保持可见,旧的(即上面的)消息被推出屏幕。你知道,它在Messenger中的工作方式,等等。但是,它不是那样工作的。较旧的消息保持可见,而较新的消息则会被推送

为了实现这一点,我尝试将
reverse
参数设置为
true
。虽然它确实解决了上述问题,但它创造了一个新的问题。每当添加一条新消息时(由于它是“反向的”,我必须在消息列表前面加上前缀),整个消息区域都会显示为“跳转”。我认为,这是因为
ListView
被颠倒了,所以索引为0的项总是最新的消息

然而,我不喜欢这种行为。对于用户来说,这似乎并不直观,用户可能希望向下滚动到最新消息,或者显示一个浮动的UI元素,指示有新消息

问题#1:我能否以某种方式禁用/更改反转列表的上述行为?我正在考虑一个回调,它计算“旧”偏移量,并在添加新消息时立即滚动到该位置。不确定这是否可能或是否符合模式

问题#2:我考虑不使用反向列表,而是添加类似于
SizeChangedLayoutNotifier
的内容,监听
列表视图的大小变化,并相应地滚动到位置。不过,这个看起来也很粗糙

一般来说,我想实现一个类似Messenger(或者其他类似的应用程序)的行为。打开软件键盘应该“向上推”消息,当新消息到达时,不应该有任何跳转或自动滚动


更新#1:找到了一个解决方法,但我宁愿不去。每当添加项目时,我都会获得
ScrollController
position.maxScrollExtent
值,然后在更新状态后,我会获得新值。从旧值中减去新值,然后从当前偏移中减去差值,最后跳到该值。瞧,我们听到了同样的信息。但这有多个缺点:

  • 根据这一解决办法的性质,它是不稳定的。您必须知道新的最大滚动范围将用于计算差异,因为您无法知道新消息的长度以及气泡的高度
  • 比赛条件?你必须等待一段任意的时间(因为没有更好的方法,有没有接受者?)。它可以在模拟器中工作,但是它可以在用户的设备上工作吗
  • 它不是声明性/反应性的。在我的本地示例中,我知道何时添加项/消息。然而,当使用流时,每次发生这种情况时,我都需要一个侦听器来捕获,这将是一件非常头痛的事情
出于上述原因,我决定不使用此变通方法



谢谢。

为了避免滚动列表视图,您可以在listview中设置此选项(物理:NeverScrollableScrollPhysics())是的,它可以有条件地应用。然而,一条消息可能在任何时候到达,这意味着,如果用户当前正在滚动,它将突然停止,这从用户体验的角度来看是非常不利的。对于否决该问题的人:请澄清它如何没有显示任何研究成果、不清楚或其他无用之处。我愿意相应地更新它,谢谢!你好,日文!你找到问题的答案了吗?我的观点完全相同,我正在开发一个聊天应用程序,不幸的是,当一条新消息到达时,我会跳过滚动条。如果你发现了什么,请分享。我投你一票,你好