【问题标题】:Flutter: Combine Multiple Future<T> TasksFlutter:组合多个 Future<T> 任务
【发布时间】:2020-10-25 03:17:23
【问题描述】:

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

我们使用Future&lt;T&gt; 喜欢

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

调用上述方法,如getData(2).then((value) =&gt; print(value));

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

【问题讨论】:

  • 相信你已经可以像dart那样调用上面的方法了,你只需要在getData(2)之前加上await
  • 检查Future.wait()
  • @pskink:我还没用过,会试试的。

标签: flutter dart future


【解决方案1】:

要同时执行所有期货,请使用Future.wait 这将获取期货列表并返回列表的未来: 假设你有这些未来。

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

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

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

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

【讨论】:

    【解决方案2】:

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

    FutureGroup 为我们提供了组合多个 期货分成一个组,最后会给出回调 当所有未来的任务工作完成时。

    依赖:

    dependencies:
      async: ^2.4.1
    

    FutureGroup如何实现?

    FutureGroup futureGroup = FutureGroup();
    futureGroup.add(future1);
    futureGroup.add(future2);
    futureGroup.add(future3);
    

    用途:

    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";
    }
    

    输出:

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

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

    【讨论】:

    • 返回类型必须是相同的类型吧?
    • @lolelo:是的,应该是。
    猜你喜欢
    • 2020-04-16
    • 2010-09-12
    • 2016-11-08
    • 1970-01-01
    • 2010-12-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-01-30
    相关资源
    最近更新 更多