0

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

像这样的东西:

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

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

我认为问题可能是它对事件侦听器没有反应。

您如何处理此类问题?

4

1 回答 1

0

您正在生成一个稍后将被填充的空列表。如果您想在生成它之前等待列表被填充,您必须这样做。

任何一个:

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;
}
于 2021-12-03T14:41:41.040 回答