Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/flutter/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Flutter 如何从Dart中的未来列表异步流式传输加载的对象_Flutter_Dart_Asynchronous_Stream_Future - Fatal编程技术网

Flutter 如何从Dart中的未来列表异步流式传输加载的对象

Flutter 如何从Dart中的未来列表异步流式传输加载的对象,flutter,dart,asynchronous,stream,future,Flutter,Dart,Asynchronous,Stream,Future,我有一个可以通过调用函数object.load()加载的对象列表。 此函数异步返回同一对象的加载版本。 我希望同时调用列表中所有对象的load()函数,并在加载完成后立即对加载的版本进行流式处理。 下面的代码可以工作,但程序一次加载一个对象 发件人: Stream<ImageIconModel> streamLoadedIcons() async* { for (var i = 0; i < imageIconModels.length; i++) { yi

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

发件人:

Stream<ImageIconModel> streamLoadedIcons() async* {
    for (var i = 0; i < imageIconModels.length; i++) {
      yield await imageIconModels[i].load().then((loadedIconModel) {
        return loadedIconModel;
      });
    }
  }
主要问题是: 在发送器中,如果我等待每次load()调用,它将执行循环中的每一步,等待load()完成。 但是如果我删除“等待”,我将返回一个未来,而不是加载的图标。

您需要的

final loadedIconModelStream=Stream.fromFutures([
对于(imageIconModels中的最终iconModel)iconModel.load(),
]);

两个@hacker1024和@pskink的答案都成功地回答了我的问题! 但这两个都没有达到预期的效果,我想我发现了原因

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

因此,我认为可能是我用来加载图像的库(multi_image_picker:^4.7.14)正在同步访问电话文件。 因此,即使我尝试同时加载每个图像,它也会同步执行任务,并按照我调用的加载顺序返回每个图像


谢谢你们的回答

像这样的<代码>ctrl=StreamController();imageIconModels.forEach((i)=>i.load().then(ctrl.add));返回ctrl.stream谢谢你的帮助@pskink!但是
ctrl.stream
返回
\u ControllerStream
而不是
。我将更多地研究类似的方法,看看是否可以使其工作或将其转换为正确的类型。
ctrl=StreamController()
    await for (var loadedIcon in streamLoadedIcons()) {
     final var result = doSomething(loadedIcon);
     yield result;
    }