异步功能后如何更改UI?

时间:2020-09-10 15:09:00

标签: flutter dart

这就是我想要做的:
我有一个函数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()结束。我的想法不多了,有人有什么建议吗?
我希望我不会错过任何明显的东西,谢谢阅读

2 个答案:

答案 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();
        }
      },
    );
  }

毕竟很酷

相关问题