Flutter 颤振:如何制作一个总是滚动到底的列表?
我试图制作一个基本上是日志屏幕的列表。也就是说,我需要列表一直滚动到底Flutter 颤振:如何制作一个总是滚动到底的列表?,flutter,Flutter,我试图制作一个基本上是日志屏幕的列表。也就是说,我需要列表一直滚动到底 如何做到这一点?我可以通过使用定时器来实现这一点,但可能应该有更好的方法。 我的解决办法是: 定义一个ScrollController()并将其附加到listView: 覆盖页面initState方法,并在其中设置计时器,如下所示: 定义一个方法\u scrollToBottom(),该方法调用: \u scrollController.jumpTo(\u scrollController.position.maxScrol
如何做到这一点?我可以通过使用
定时器来实现这一点,但可能应该有更好的方法。
我的解决办法是:
定义一个ScrollController()
并将其附加到listView:
覆盖页面initState
方法,并在其中设置计时器,如下所示:
定义一个方法\u scrollToBottom()
,该方法调用:
\u scrollController.jumpTo(\u scrollController.position.maxScrollExtent)代码>
在小部件上设置reverse:true
,并反转子列表
ListView(
//默认情况下,“开始”滚动到底部,并停留在那里。
相反:是的,
children:widget.children.reversed.toList(可增长:false),
),
如果您有一个很长的列表,并且反向开销很大,则可以使用ListView.builder反向索引而不是整个列表
ListView.builder(
相反:是的,
itemCount:items.length,
itemBuilder:(上下文,索引){
最终反向索引=items.length-1-索引;
最终项目=项目[反向索引];
返回MyWidget(项目);
}
)
我是从甘特上面的评论中得到的。谢谢 我发现WidgetsBinding.instance.addPostFrameCallback
在很多情况下都非常有用,比如您需要一些后期生成处理。在这种情况下,它解决了以下问题
(1) 定义滚动控制器
final ScrollController_sc=ScrollController()代码>
(2) 在ListView生成器中添加以下语句:
WidgetsBinding.instance.addPostFrameCallback((_) => {_sc.jumpTo(sc.position.maxScrollExtent)});
(3) 在ListView参数中包括参数控制器:_sc,
我还构建了一个日志查看器。工作起来就像一个冠军。添加反向:true
(并以相反的顺序添加项目)我尝试过,但几乎不可能以相反的顺序添加iTen,因为“ReplaySubject”对此没有任何方法=(为什么需要计时器?只有在有新日志时才可以使用.jumpTo..My position对象始终为空,我已将其附加到SingleChildsCallView。您能帮助我理解为什么会出现这种情况吗?M.Leonhard的答案更清晰。您可以避免处理有状态的小部件、计时器、记住取消它们等等。添加了编辑关于如何使用ListView.builder
来完成sameThanks!对我来说,列表很长,我的列表是一个带有标题的粘性列表,我使用了一个映射从键中获取标题,从值中获取列表项(这是一个列表)。此解决方案最适合我。仅供参考,SchedulerBinding.instance.addPostFrameCallback((){controller1.animateTo(controller1.position.maxScrollExtent,持续时间:常量持续时间(毫秒:10),curve:Curves.easeOut,;})}对我不起作用。它只是将我的列表滚动了一半。这将颠倒列表中项目的顺序,将最后一项放在前面,第一项放在最后。它实际上不会显示底部。它将在切换项目时显示顶部。对我来说,这很好。对我来说,我认为这应该标记为正确答案。何时一旦建立了列表,它就会显示列表的底部。不需要定时器。谢谢。我总是寻找最少的运动部件来阻止墨菲。我认为这是最有效的方法。是的,这很好…这应该是公认的答案…非常整洁和清晰
@override
void initState() {
super.initState();
Timer.periodic(Duration(milliseconds: 100), (timer) {
if (mounted) {
_scrollToBottom();
} else {
timer.cancel();
}
});
}
WidgetsBinding.instance.addPostFrameCallback((_) => {_sc.jumpTo(sc.position.maxScrollExtent)});