Flutter:组合多个 Future<T> 任务

jit*_*555 14 future dart flutter

我们如何合并多个 FutureTask,以便我们可以在同一响应中获得所有的回调。

我们使用Future<T>

Future<String> getData(int duration) async {
  await Future.delayed(Duration(seconds: duration)); //Mock delay
  return "This a test data for duration $duration";
}
Run Code Online (Sandbox Code Playgroud)

调用上面的方法就像getData(2).then((value) => print(value));

如果我们想调用多个Future Task,那么该怎么做呢?

小智 17

要同时执行所有 future,请使用Future.wait This 采用 future 列表并返回列表的 future: 假设您有这些 future。

class CovidAPI {
  Future<int> getCases() => Future.value(1000);
  Future<int> getRecovered() => Future.value(100);
  Future<int> getDeaths() => Future.value(10);
}
Run Code Online (Sandbox Code Playgroud)

您可以使用 Future.wait([list of futures]) 将所有 future 放在一起

final api = CovidAPI();
final values = await Future.wait([
    api.getCases(),
    api.getRecovered(),
    api.getDeaths(),
]);
print(values); // [1000, 100, 10]
Run Code Online (Sandbox Code Playgroud)

当 future 是独立的并且不需要按顺序执行时,这是理想的选择。来源:https ://codewithandrea.com/videos/top-dart-tips-and-tricks-for-flutter-devs/


jit*_*555 6

对于它来说,FutureGroup 可以用来组合多个流

FutureGroup 为我们提供了将多个 future 合并为一个组的功能,当所有 future 任务完成时,它将在最后给出回调。

依赖关系:

dependencies:
  async: ^2.4.1
Run Code Online (Sandbox Code Playgroud)

如何实施FutureGroup?

FutureGroup futureGroup = FutureGroup();
futureGroup.add(future1);
futureGroup.add(future2);
futureGroup.add(future3);
Run Code Online (Sandbox Code Playgroud)

使用:

void main()  {
  Future<String> future1 = getData(2);
  Future<String> future2 = getData(4);
  Future<String> future3 = getData(6);
  FutureGroup futureGroup = FutureGroup();
  futureGroup.add(future1);
  futureGroup.add(future2);
  futureGroup.add(future3);
  futureGroup.close();
  futureGroup.future.then((value) => {print(value)});
}

Future<String> getData(int duration) async {
  await Future.delayed(Duration(seconds: duration)); //Mock delay
  return "This a test data";
}
Run Code Online (Sandbox Code Playgroud)

输出:

I/flutter ( 5866): [这是一个测试数据,这是一个测试数据,这是一个测试数据] // 6 秒后调用。

注意:只有当所有 Future Task 完成时才会调用一次,这里它将在 6 秒后运行。