【问题标题】:How to make sure 2 async functions are executed before when connection state becomes done?如何确保在连接状态完成之前执行 2 个异步函数?
【发布时间】:2019-04-05 17:31:18
【问题描述】:

我正在像这样使用FutureBuilder -

FutureBuilder( future: _future, builder: (BuildContext context, AsyncSnapshot snapshot) { return snapshot.connectionState != ConnectionState.done ? CircularProgressIndicator() : Text('Done'); }, ),

initState,我打电话给_future = getData();

getData 调用两个异步函数,它们仅在连接状态完成后才被调用。在执行这两个功能之前,我应该进行什么检查以确保显示进度指示器?

【问题讨论】:

    标签: asynchronous dart flutter


    【解决方案1】:

    假设您的异步函数的执行顺序并不重要,您可以执行以下操作:

    initState(){
        _future = Future.wait( [yourAsyncFunc1(), yourAsyncFunc2()] );
     }
    

    在这种情况下,yourAsyncFunc1()yourAsyncFunc2() 是您在 getData 函数中调用的 async 函数。 Future.wait(..., ...) 调用立即返回一个未来对象,但这个未来仅在 yourAsyncFunc1yourAsyncFunc2 执行完成后完成。因此,您可以在 future 属性中使用带有 _future 的 FutureBuilder 小部件并查看结果。

    【讨论】:

      【解决方案2】:

      使用带有等待的异步函数。

      类似

      Future<void> getData() async {
        await future1Function();
        await future2Function();
      }
      

      【讨论】:

      • 是的,我做到了。连接状态在这些功能完成之前完成。这些函数与服务器交互并获取一些信息。
      • 改用snapshot.hasData
      • 我的函数没有返回任何值。
      • 在这种情况下,FutureBuilder 对您来说并不是理想的解决方案。而不是 FutureBuilder,只需在您的小部件状态类上使用 bool isDone = false。在您的 getData() 函数中执行您的请求,然后在执行 setState({isDone = true}) 之后,在您的 build() 函数中返回 isDone ? Text('Done') : CircularProgressIndicator()
      • 我不想setState 并再次构建我的小部件树。我相信一定有办法使用FutureBuilder
      猜你喜欢
      • 1970-01-01
      • 2020-02-06
      • 1970-01-01
      • 1970-01-01
      • 2021-03-24
      • 1970-01-01
      • 2016-09-12
      • 2012-08-04
      • 1970-01-01
      相关资源
      最近更新 更多