这就是我想要做的:
我有一个函数InitMyContext(),需要一些时间才能完成。我想在此函数运行时显示正在加载的小部件,然后显示另一个小部件。
我想到的想法是拥有一个全局密钥,当加载密钥的值为0并在InitMyContext()的末尾将密钥的值更改为1时。这是我现在的代码:
keyInitMyCtx = 0;
Widget build(BuildContext context) {
initMyContext();
if (keyInitMyCtx == 0) {
return LoadingScreen(text: 'Loading...');
} else {
return WidgetScreen();
}
}
void initMyContext() async {
keyInitMyCtx = 0;
await Future.delayed(Duration(seconds: 4)); // Simulate 4 seconds of delay
keyInitMyCtx = 1;
}
但是问题是,我无法执行SetState()重绘BuildContext()并显示WidgetScreen,因为SetState()不能异步等待initMyContext()结束。我的想法不多了,有人有什么建议吗?
我希望我不会错过任何明显的东西,谢谢阅读
答案 0 :(得分:1)
您不应该在SELECT <result fields>
FROM filtered_table AS A
LEFT OUTER JOIN tableB ON A.id = tableB.id
WHERE a.field = value
函数中等待4秒。您的构建功能应尽可能快。
您最好像这样构造代码:
build
这样,您的构建函数将以0调用,然后在4秒后以1调用
答案 1 :(得分:0)
感谢pskink。我确实查看了futureBuilder,我认为我对Flutter应用程序背后的逻辑了解得更好一些。这是我想出的解决方案:
Widget build(BuildContext context) {
return FutureBuilder(
future: initMyContext(),
builder: (context, _key) {
switch (_key.connectionState) {
case ConnectionState.waiting:
return LoadingScreen(msg: 'Loading...');
default:
return MyScreenWidget();
}
},
);
}
毕竟很酷