Flutter 使用异步函数后如何更改UI?
以下是我想做的:Flutter 使用异步函数后如何更改UI?,flutter,dart,Flutter,Dart,以下是我想做的: 我有一个函数InitMyContext(),需要一些时间才能完成。我想在这个函数运行时显示我的加载小部件,然后显示另一个小部件 我的想法是使用一个全局键,当加载键的值为0时,在InitMyContext()的末尾将键的值更改为1。以下是我目前的代码: keyInitMyCtx = 0; Widget build(BuildContext context) { initMyContext(); if (keyInitMyCtx == 0) { return Lo
我有一个函数InitMyContext(),需要一些时间才能完成。我想在这个函数运行时显示我的加载小部件,然后显示另一个小部件 我的想法是使用一个全局键,当加载键的值为0时,在InitMyContext()的末尾将键的值更改为1。以下是我目前的代码:
keyInitMyCtx = 0;
Widget build(BuildContext context) {
initMyContext();
if (keyInitMyCtx == 0) {
return LoadingScreen(text: 'Loading...');
} else {
return WidgetScreen();
}
}
但问题是,我无法使用SetState()重新绘制BuildContext()并显示WidgetScreen,因为SetState()不能异步等待initMyContext()的结束。我没什么主意了,有人有什么建议吗
我希望我没有错过一些明显的东西,感谢您阅读您不应该在
构建功能中等待4秒钟。您的构建函数应该尽可能快
最好是这样构造代码:
class YourWidget {
initState() {
keyInitMyCtx = 0;
Timer(const Duration(seconds: 4), () {
setState(() {
keyInitMyCtx = 1;
});
});
}
}
这样,您的构建函数将在0时调用,然后在4秒后使用1调用,这要感谢pskink。我确实看过futureBuilder,我想我更了解Flatter应用程序背后的逻辑。以下是我提出的解决方案:
Widget build(BuildContext context) {
return FutureBuilder(
future: initMyContext(),
builder: (context, _key) {
switch (_key.connectionState) {
case ConnectionState.waiting:
return LoadingScreen(msg: 'Loading...');
default:
return MyScreenWidget();
}
},
);
}
看起来很酷,毕竟检查FutureBuilder
你在哪里调用initParcoursContext()?我会找FutureBuilder,谢谢。我正确地更改了函数名initMyContext
isasync
方法,因此它返回一个Future
-在FutureBuilder
中使用该Future
,据我所知,在您的情况下使用setState没有问题,您尝试过吗?它会导致问题吗?我认为它不能工作,initMyContext()执行不需要4秒,我使用了4秒作为示例。事实上,我正在从Firestore云加载信息,所以只需要几毫秒。我只是想想想那些没有快速连接的人,当我有很多信息要加载时。当然,我不是说你应该在initState中引入4s延迟。但将对定时器的调用替换为任何异步调用(对firestore或任何其他远程API的调用),并在回调中使用setState((){keyInitMyCtx=1})代码>
Widget build(BuildContext context) {
return FutureBuilder(
future: initMyContext(),
builder: (context, _key) {
switch (_key.connectionState) {
case ConnectionState.waiting:
return LoadingScreen(msg: 'Loading...');
default:
return MyScreenWidget();
}
},
);
}