flutter - 滚动未来的 ListView
问题描述
我正在创建一个包含项目列表的页面。我想在列表呈现后滚动到页面底部。问题是我正在使用 FutureBuilder 来获取列表。如果我使用WidgetsBinding.addPostFrameCallback
它似乎在build()
方法完成之前被调用(可能是因为它仍在获取数据的过程中)。
有没有办法确定 Future 已经完成,列表已经呈现,然后才触发滚动到底部?
@override
void initState() {
WidgetsBinding.instance.addPostFrameCallback((_) => _postInit());
super.initState();
}
Future<void> _postInit() async {
_scrollController.jumpTo(_scrollController.position.maxScrollExtent);
}
@override
Widget build(BuildContext context) {
return Scaffold(
body: FutureBuilder(
future: _getList(),
builder: (BuildContext context, AsyncSnapshot snapshot) {
switch(snapshot.connectionState) {
case ConnectionState.none:
case ConnectionState.waiting:
return Center(child: SizedBox(height: 100, width: 100, child: new CircularProgressIndicator()));
break;
default:
if(snapshot.hasError) {
return Container();
} else {
return _buildListView(snapshot.data);
}
}
}
)
);
}
Widget _buildListView(list) {
return Column(
children: <Widget>[
Expanded(
child: ListView(
controller: _scrollController,
shrinkWrap: true,
children: list,
),
),
],
);
}
解决方案
尝试WidgetsBinding.instance.addPostFrameCallback((_) => _postInit());
从您的initState
方法中删除。
之后,delayed
在您的方法中添加一个函数_postInit()
,并在收到数据时调用它以显示您的列表,如下所示:
Future<void> _postInit() async {
await Future.delayed(Duration(milliseconds: 100));
_scrollController.jumpTo(_scrollController.position.maxScrollExtent);
}
@override
Widget build(BuildContext context) {
return Scaffold(
body: FutureBuilder(
future: _getList(),
builder: (BuildContext context, AsyncSnapshot snapshot) {
switch(snapshot.connectionState) {
case ConnectionState.none:
case ConnectionState.waiting:
return Center(child: SizedBox(height: 100, width: 100, child: new CircularProgressIndicator()));
break;
default:
if(snapshot.hasError) {
return Container();
} else {
_postInit();
return _buildListView(snapshot.data);
}
}
}
)
);
}
推荐阅读
- .net - 路径 /ASP.NET/Https 和 /Microsoft/UserSecrets)未在 mac 上共享
- python - PyBind11:boost::multiprecision::cpp_int 到 Python
- docker - Rust musl Docker 镜像找不到 Cargo
- react-native - 当在另一个视图中包含一个视图时对本机导航做出反应
- java - testng:在方法之间共享实例变量时运行并行=方法
- aframe - A-Frame 中的 3D 天空盒
- c# - Windows Server 2019 上的 Xamarin 模拟器
- string - Hive - 不保留空字符串
- react-native - flexWrap 中元素的对齐方式取决于元素的数量
- unity3d - 允许玩家在 Unity 中拖动对象