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
is
async
方法,因此它返回一个
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();
        }
      },
    );
  }