[英]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.