如何在没有FutureBuilder的情况下收听一堆期货?

时间:2019-09-18 20:25:31

标签: flutter dart

我已经构建了一个FutureBuilder来检查Future,然后基于该重定向,但是由于它是FutureBuilder,因此我必须将屏幕未路由返回给他们。 有人可以分享如何在没有FutureBuilder的情况下收听一堆期货的例子,所以我可以使用动画路由而不是虚拟收益。

FutureBuilder(
    future: Future.wait([
         firstFuture(),
         secondFuture(),
    ]),
    builder: (
       context, 
       AsyncSnapshot<List<bool>> snapshot, 
    ){

       if (!snapshot.hasData) { 
          return CircularProgressIndicator();
       }

       // If all future passed return home.
       if (snapshot.data[0] && snapshot.data[1]) 
          // Instead I want: MaterialPageRoute(builder: (_) => HomeScreen());
          return HomeScreen();

       // Instead I want: MaterialPageRoute(builder: (_) => permissionsScreen());
       return permissionsScreen();

    }
);

1 个答案:

答案 0 :(得分:0)

根据pskink的建议,我实现了此代码,该代码将循环运行并等待一堆Future完成,然后路由或执行任何没有FutureBuilder的操作

//.. inside a StatfulWidget or whatever...

// Loop thru Dependencies List(Futures) and make sure all are loaded(finished).
Future<bool> loadDependencies(List<Future<bool>> dependenciesList) async {
    bool isAllDone = true;

    // Load dependencies.
    for (Future<bool> dependency in dependenciesList) {
      bool currentDep = await dependency;
      isAllDone = isAllDone && currentDep;
      if (!isAllDone) return false; // Break if any failed.
    }

    return isAllDone;
}

然后调用它,这是一个示例:

//.. inside a StatfulWidget

// Define App's Dependencies List.
final List<Future<bool>> dependenciesList = [
    someBloc.fetchData(),
];

@override
void initState() {
  super.initState();
  // Load dependencies then route once done.
  loadDependenciesAndRoute();
}

void loadDependenciesAndRoute() async {
    bool loadingStatus = await loadDependencies(dependenciesList);

    if (loadingStatus) {
      // As Context is not ready inside initState, routing using navigatorKey.
      await AppKeys.navigatorKey.currentState.push(
        Routes.home(),
      );
    } else {
      await AppKeys.navigatorKey.currentState.push(
          Routes.onLoading(),
      );
    }
}