繁体   English   中英

无法在 dart/flutter 中的 Stream 内的 forEachAsync 中屈服

[英]Can't yield in forEachAsync inside Stream in dart/flutter

我在async* Stream有一个forEachAsync并且无法yield

Stream<ProjectState> _mapProjectSelectedEventToState(ProjectSelected event) async* {
    try {
      yield ProjectLoading(
        message: 'Fetching database',
        fetchedCount: 0,
        totalCount: 1,
      );
      await forEachAsync(fileModels, (FileEntity fileModel) async {
        await downloader.download(filename: fileModel.hashName);
        _totalMediaFilesFetched++;

        //// ERROR - THIS DOES NOT WORK ////
        yield (ProjectLoadingTick(
          _totalMediaFiles,
          _totalMediaFilesFetched,
        ));

      }, maxTasks: 5);
    } catch (error, stacktrace) {
      yield ProjectFailure(error: error);
    }
  }

我尝试了其他方法,即发送消息并将其转换为状态,但效果不佳。 似乎整个应用程序都被这个await forEachAsync阻止了。

我正在使用 bloc 模式,它根据当前的ProjectSelected event对发出的ProjectStates做出反应

您的尝试不起作用,因为您在callback 中使用了yield ,而不是在返回Stream的函数中。 也就是说,您正在尝试等效于:

Stream<ProjectState> _mapProjectSelectedEventToState(ProjectSelected event) async* {
  ...
  await forEachAsync(fileModels, helperFunction);
  ...
}

Future helperFunction(FileEntity fileModel) async {
  ...
  yield ProjectLoadingTick(...);
}

这没有意义。

由于关心forEachAsync为未完成的异步操作的数量设置最大限制的能力,您最好使用StreamController ,您可以手动将事件添加到:

var controller = StreamController<ProjectState>();

// Note that this is not `await`ed.
forEachAsync(fileModels, (FileEntity fileModel) async {
    await downloader.download(filename: fileModel.hashName);
    _totalMediaFilesFetched++;

    controller.add(ProjectLoadingTick(
      _totalMediaFiles,
      _totalMediaFilesFetched,
    ));
  },
  maxTasks: 5);
yield* controller.stream;

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM