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