我的屏幕上有一个listView.我已经附加了一个控制器.我可以调用我的端点,接收响应,解析它并插入行.ListView应该自动滚动.确实如此,但并非完美无缺.我总是背后的一个项目.这是我的代码:
@override
Widget build(BuildContext context) {
// Scroll to the most recent item
if (equationList.length > 0) {
_toEnd();
}
return new Scaffold(
appBar: new AppBar(
title: new Text(widget.title),
),
body: EquList(equationList, _scrollController),
floatingActionButton: new FloatingActionButton(
onPressed: onFabClick,
tooltip: 'Fetch Post',
child: new Icon(isLoading ? Icons.pause : Icons.play_arrow),
),
);
}
void _toEnd() {
_scrollController.animateTo(
_scrollController.position.maxScrollExtent,
duration: const Duration(milliseconds: 250),
curve: Curves.ease,
);
}
Run Code Online (Sandbox Code Playgroud)
问题是,我_toEnd()
在最后一项插入列表之前调用函数.所以,我正在寻找一个回调(如果有的话)告诉我build()
完成了.然后我打电话给我的_toEnd()
功能.
在这种情况下,最佳做法是什么?
这里的文档关于如何更新ListView
发言权:
在Flutter中,如果要更新setState()中的小部件列表,您会很快发现您的数据没有直观地改变.这是因为当调用setState()时,Flutter呈现引擎会查看窗口小部件树以查看是否有任何更改.当它到达ListView时,它执行==检查,并确定两个ListView是相同的.没有任何改变,因此不需要更新.
有关更新ListView的简单方法,请在setState()内创建一个新List,并将旧列表中的数据复制到新列表中.
我不知道渲染引擎如何确定在这种情况下Widget Tree中是否有任何更改.
AFAICS,我们关心调用setState
,它将State
对象标记为脏并要求重建.一旦它重建就会有新的ListView
,不是吗?那么==
检查怎么说它是同一个对象呢?
此外,新的List
将是State
对象的内部,Flutter引擎是否比较对象内的所有State
对象?我以为它只比较了Widget
树.
所以,基本上我不明白渲染引擎如何决定它将要更新的内容以及将要忽略的内容,因为我无法看到创建新内容如何List
向渲染引擎发送任何信息,因为文档说渲染引擎只是寻找新的ListView
...而AFAIK新的List
不会创造新的ListView
.