簡體   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