我正在使用颤振制作一个简单的记事本应用程序。我想从 SQLite 数据库加载已经保存的数据并在应用程序打开时初始化状态。我尝试使用带有异步方法的 initState() 方法。但是异步方法在 initState() 方法中不起作用。有些地方说要使用 Future builder 和 BLoC。但我不太确定哪个好。在颤振中实现这一点的最佳方法是什么?
问问题
2404 次
3 回答
0
你有两个选择。
选项 1:按照@UtakarshSharma 所说的去做。下面的示例实现。
@override
void initState() {
super.initState();
_requestSqlData();
}
void _requestSqlData(){
_requestSqlDataAsync();
}
void _requestSqlData() async {
var _data = await getData(); // call API/await function to get the data
}
选项2:在全屏加载后使用回调方法。并使用 setState 更新屏幕。您必须使用 flutter_after_layout ( https://github.com/slightfoot/flutter_after_layout ) 它在布局完成后执行该功能。:
void initState() {
super.initState();
WidgetsBinding.instance
.addPostFrameCallback((_) => myAwesomeFunction(context));
}
于 2020-03-21T06:37:14.827 回答
0
如果您知道如何从 sql lite 加载数据,则使用 async 和 await 在 initstate() 之外定义该函数并在 initstate() 中调用它。Initstate 不能是异步的,因为它必须在您的主应用程序之前运行,因此我们可以使用外部函数。
- 使用异步等待定义名为 sqlData() 的函数
- 在 initstate 中调用它。
于 2020-03-21T04:32:49.867 回答
0
我发现这种方法对我有用。在你的异步函数上使用 .then()
@override
void initState() {
super.initState();
db.getData().then((value){
_valueState = value;
});
}
于 2020-07-25T06:58:00.867 回答