【问题标题】: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;
}