我的屏幕上有一个 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,
);
}
问题是,我正在打电话_toEnd()
最后一项插入列表之前的函数。所以,我正在寻找一个回调(如果有的话)来告诉我build()
已经完成了。然后我打电话给我的_toEnd()
功能。
在这种情况下,最佳做法是什么?
通用解决方案
澄清一下,我没想到这个问题会引起如此多的关注。因此,我只回答这个非常具体的案例。
As 另一个答案中解释过 WidgetsBinding
提供了一种添加方法one time 柱架callback.
WidgetsBinding.instance!.addPostFrameCallback((_) {
// executes after build
})
因为这个回调将只被调用一次,您将需要在每次构建时添加它:
@override
Widget build(BuildContext context) {
WidgetsBinding.instance!.addPostFrameCallback((_) => afterBuild);
return Container(); // widget tree
}
void afterBuild() {
// executes after build is done
}
具体(异步)
详细阐述Günter's评论:
@override
Widget build(BuildContext context) {
executeAfterBuild();
return Container();
}
Future<void> executeAfterBuild() async {
await Future.delayed(Duration.zero);
// this code will get executed after the build method
// because of the way async functions are scheduled
}
有一个很好的例子说明这种效果 here.
有关的广泛信息Dart 中的调度 可以在这里找到.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)