我如何从Dart的期货列表异步流加载对象



我有一个可以通过调用object.load()函数加载的对象列表。此函数异步返回同一对象的加载版本。我想同时调用列表中所有对象的load()函数,并在加载完成后立即流式传输加载的版本。下面的代码可以工作,但是程序每次加载一个对象。

发送者:

Stream<ImageIconModel> streamLoadedIcons() async* {
for (var i = 0; i < imageIconModels.length; i++) {
yield await imageIconModels[i].load().then((loadedIconModel) {
return loadedIconModel;
});
}
}

接收机:

await for (var loadedIcon in streamLoadedIcons()) {
final var result = doSomething(loadedIcon);
yield result;
}

主要问题是:在发送器中,如果我等待每个load()调用,它将执行循环中的每个步骤,等待load()完成。但是如果我删除了&;await&;,我将返回一个future,而不是加载的图标。

你需要Stream.fromFutures

final loadedIconModelStream = Stream.fromFutures([
for (final iconModel in imageIconModels) iconModel.load(),
]);

@hacker1024和@pskink的答案都成功回答了我的问题!但是这两种方法都没有达到预期的效果,我想我找到了原因。

我将load()方法替换为Future.delayed(duration: random),然后程序按预期工作。

所以我认为发生的事情是,可能我正在使用的lib加载图像(multi_image_picker: ^4.7.14)正在同步访问手机文件。因此,即使我尝试同时加载每个图像,它也会同步执行任务,并按照我调用它们加载的顺序返回每个图像。

谢谢你们的回答!

最新更新