flutter - 在 setState 渲染后执行函数
问题描述
在我的应用程序中,我想在添加项目后滚动到 ListView 的底部。问题是它在添加项目之前向下滚动,因此隐藏了一个项目。有没有办法在项目渲染后调用滚动函数?
示例代码:
class MyHomePage extends StatefulWidget {
@override
_MyHomePageState createState() => _MyHomePageState();
}
class _MyHomePageState extends State<MyHomePage> {
var _items = [];
var _counter = 0;
final _listViewController = ScrollController();
void _addItem() {
setState(() {
_items.add(++_counter);
});
_listViewController.jumpTo(_listViewController.position.maxScrollExtent);
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text('Demo'),
),
body: ListView(
padding: const EdgeInsets.all(16.0),
controller: _listViewController,
children: [
..._items.map((i) => ListTile(title: Text(i.toString()))),
],
),
floatingActionButton: FloatingActionButton(
onPressed: _addItem,
child: Icon(Icons.add),
),
);
}
}
解决方案
使用 WidgetsBinding.instance.addPersistentFrameCallback :
https://api.flutter.dev/flutter/scheduler/SchedulerBinding/addPersistentFrameCallback.html
bool added = false;
void initState() {
WidgetsBinding.instance.addPersistentFrameCallback(jumpToDown);
super.initState();
}
void _addItem() {
setState(() {
_items.add(++_counter);
added = true;
});
}
void jumpToDown([nothing]) {
if (added) {
_listViewController.jumpTo(_listViewController.position.maxScrollExtent);
}
added = false;
}
推荐阅读
- c# - 建立与 SQL GRAPH API ADO 的连接时发生与网络相关或特定于实例的错误
- python - 返回 None 而不是 False
- google-apps-script - Google 表单中的可填写表格,用于记录特定 Google 表格中的数据
- intellij-idea - 运行 Java 11.02 JavaFX .jar 应用程序会产生奇怪的输出
- c++ - 如何使用快速排序对二维双打向量进行排序?
- java - Netbeans 11.2 的 Build > Compiling 窗格中没有“Additional Compiler Options”
- javascript - Promise All 在第一次 Promise 后卡住
- angular7 - 当我设置延迟加载时,为什么我的 Angular 7 应用程序不会在根路由中呈现任何内容?
- r - 绘制多个箱线图时如何使用 x 的特定离散值
- reactjs - 使用 async/await 更新 react-native 状态