【问题标题】:Stream of List with elements from another streams' current values具有来自另一个流当前值的元素的 List 流
【发布时间】:2022-01-09 17:54:51
【问题描述】:

我想创建一个基于另一个元素流的列表流。每次列表中的元素发出新值时,列表流都应该产生一个新列表。

类似这样的:

Stream<List<Model>> getListStream(List<int> ids) async* {
  final List<Model> models = [];
  for (var id in ids) {
    getModelStream(id).listen((event) {
      models.add(event);
    });
  }
  yield models;
}

但它总是产生一个空数组。

我认为问题可能在于它没有对事件侦听器做出反应。

你如何处理这种问题?

【问题讨论】:

    标签: dart dart-async dart-stream


    【解决方案1】:

    您将生成一个稍后将被填充的空列表。 如果您想等待列表填写完毕后再提交,则必须这样做。

    要么:

    Stream<List<Model>> getListStream(List<int> ids) async* {
      for (var id in ids) {
        yield await getModelStream(id).toList();
      }
    }
    

    或者,如果您想立即启动所有流,并并行计算它们,然后在它们完成时发出值(不一定按照原始 ID 顺序),那么:

    Stream<List<Model>> getListStream(List<int> ids) {
      var controller = StreamController<List<Model>>(sync: true);
      controller.onListen = () {
        var count = 0;
        for (var id in ids) {
          count++;
          getModelStream(id).toList().then((models) {
            controller.add(models);
            if (--count == 0) controller.close();
          });
        }
      };
      return controller.stream;
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-11-03
      • 2016-07-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-01-08
      • 2019-09-25
      相关资源
      最近更新 更多