【问题标题】:Flutter initState wait for async function to completeFlutter initState 等待异步函数完成
【发布时间】:2020-07-28 21:43:38
【问题描述】:

在我的 main.dart 中,我有这两个功能:

    Future<void> _fetchMasterData() async {
    print("Start fetch");
    var jwt = await API.attemptLogIn();
    if (jwt != null) {
      Map<String, dynamic> answer = jsonDecode(jwt);
      if (answer['message'] == 'Auth ok') {
        jwtToken = 'Bearer ' + answer['token'];
      }
    }

    await _getArticles();
    await _getMainCategories();
    await _getIngredients();
    await _getArticleIngredients();
    print("EndMasterData fetch");
  }

还有

    @override
  void initState() {
    super.initState();
    _fetchMasterData();
  }

我想要的是在 initState 中等待直到 _fethcMasterData 完成,然后再调用 Widgert 构建。

这可能吗?非常感谢您的帮助!

【问题讨论】:

    标签: flutter asynchronous async-await


    【解决方案1】:

    这里是我如何在 initstate 中使用异步函数;

     builder() async {
        favoriteDatabase =
        await $FloorFavoriteDatabase.databaseBuilder('favorite_database.db')
            .build();
        setState(() {
          favoriteDao = favoriteDatabase.favoriteDao;
        });
      }
    
    
      @override
      void initState() {
        // TODO: implement initState
        super.initState();
        WidgetsBinding.instance.addPostFrameCallback((_) {
          WidgetsBinding.instance.addPostFrameCallback((_) =>
              getNamePreferences().then(updateName));
        });
        builder();
        favoriteDao.findAllMoviesAsStreamW();
        favoriteDao.findAllMoviesAsStream();
      }
    

    你也可以查看this迷你文章。

    【讨论】:

      【解决方案2】:

      不可能在 initState 中等待,因此当您完成所有加载过程后,您可以调用 SetState 方法,用实际数据填充您的小部件。

      第二种解决方案可能是使用 futurebuilder 或 streambuilder 来显示数据,但只有在任何方法数据不相互依赖时才有可能。

       Future<void> _fetchMasterData() async {
          print("Start fetch");
          var jwt = await API.attemptLogIn();
          if (jwt != null) {
            Map<String, dynamic> answer = jsonDecode(jwt);
            if (answer['message'] == 'Auth ok') {
              jwtToken = 'Bearer ' + answer['token'];
            }
          }
      
          await _getArticles();
          await _getMainCategories();
          await _getIngredients();
          await _getArticleIngredients();
          print("EndMasterData fetch");
          SetState((){});  // added line
        } 
      

      【讨论】:

      • 我不确定我是否正确理解了这个问题,但您可以将异步与 initstate 一起使用,例如“void initState() async{ _fetchMasterData();}”或“”void initState() async{ await _getArticles();}" 等
      • 对不起我的错误,但不是这样,“void initState() { _fetchMasterData();}”我会从我的代码中发布一个示例作为答案,然后你可以检查。
      • 据我所知,异步任务需要时间来完成过程,同时构建方法完成构建小部件,因此我们不会从异步方法获取 ant 数据。用实际数据填充我们的小部件,我们必须在异步方法结束时调用 SetState。
      • 没错,但在我看来,未来的构建器(或流)是这种情况下的最佳解决方案。而不是 initstate "future: _fetchMasterData()" 可以更好地工作。
      • 是的,我在我的回答中也提到了这一点,但在这里他一个一个地调用了许多方法,所以如果他需要第一个方法在另一个方法中计算数据,那么这种方法可能是最好的解决方案。
      猜你喜欢
      • 2019-06-16
      • 1970-01-01
      • 2019-11-29
      • 2021-08-09
      • 2023-03-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多