如何在 Dart 中制作 Future.wait 的 Stream 版本?

Thi*_*tal 2 dart flutter

我想Future.wait()在一些网络调用上运行,以便它们可以同时运行。我想进一步加快速度,在结果可用时返回结果,以便我可以开始显示它们。我认为只需对调用进行一个小修改Future.wait就可以了,但不幸的是,它在内部使用私有类。有更好的方法来实现这一点吗?

Future.wait dart 文档

Ser*_*kov 7

您可以使用Stream.fromFutures 构造函数

流按照 future 完成的顺序在流上报告 future 的结果。每个 future 都提供数据事件或错误事件,具体取决于 future 的完成方式。

如果在调用 Stream.fromFutures 时某些 future 已经完成,它们的结果将以某种未指定的顺序发出。

当所有 future 完成后,流将关闭。

Stream<int> streamingInts = Stream.fromFutures([
  Future.delayed(Duration(seconds: 1), () => 1),
  Future.delayed(Duration(seconds: 2), () => 2),
]);

 await for (final i in streamingInts) {
   print(i);   
 }
Run Code Online (Sandbox Code Playgroud)

我的真实用例 - 表明加载需要比预期更多的时间

  1. 如果我真正的 api 调用很快结束,我只需产生 LoadedState 并停止监听流
  2. 如果我真正的 api 调用太慢,特殊的 Future.delayed 将触发特殊状态 LoadingTakesTooLongState
      Stream<BlocState> loadingStates = Stream.fromFutures([
        Future.delayed(_kTooSlowDelay, () => LoadingTakesTooLongState()),
        _loadData(),
      ]);

      await for (var state in loadingStates) {
        yield state;
        if (state is LoadedState) break;
      }

      Future<LoadedState> _loadData() ...
Run Code Online (Sandbox Code Playgroud)