本文介绍了Dart从另一个流侦听器产生流事件的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
我有一个生成特定事件的stream
的函数.现在,我有一个来自存储服务的流,它具有自己的事件.寻找一种在storage stream
中发生更改时产生事件的方法.
I have a function that generates stream
of specific events. Now I have a stream coming from storage service which has its own events. Looking for a way to yield my events when something changes in the storage stream
.
此代码段无法解决问题.
This code snippet doesn't do the trick.
Stream<BlocState> mapEventToState(
BlocEvent event,
) async* {
if (event is UploadData) {
yield UploadDataProgress(progress: 0.0);
final Storage storage = Storage();
final Stream<StorageEvent> upload = storage.upload(event.data);
upload.listen((StorageEvent storageEvent) async* {
print('***** Listener: ${storageEvent.type} - ${storageEvent.progress}');
if (storageEvent.type == StorageEventType.error) {
yield UploadDataError(errorMessage: storageEvent.error);
}
if (storageEvent.type == StorageEventType.success) {
yield UploadDataSuccess();
}
if (storageEvent.type == StorageEventType.progress) {
yield UploadDataProgress(progress: storageEvent.progress);
}
});
}
}
输出:调试打印有效,但事件不会发送给侦听器.
Output:The debug print works but the events are not sent to listeners.
***** Listener: StorageEventType.progress - 0.01924033836457124
***** Listener: StorageEventType.progress - 0.044581091468101464
***** Listener: StorageEventType.progress - 0.6986233206170177
***** Listener: StorageEventType.progress - 1.0
推荐答案
您的yield
来自匿名函数(StorageEvent storageEvent) async* {
而不是mapEventToState
.
Your yield
s are yielding from the anonymous function (StorageEvent storageEvent) async* {
rather than from mapEventToState
.
只需将listen()
替换为await for
即可.
Stream<BlocState> mapEventToState(
BlocEvent event,
) async* {
if (event is UploadData) {
yield UploadDataProgress(progress: 0.0);
final Storage storage = Storage();
final Stream<StorageEvent> upload = storage.upload(event.data);
await for (StorageEvent storageEvent in upload) {
print('***** Listener: ${storageEvent.type} - ${storageEvent.progress}');
if (storageEvent.type == StorageEventType.error) {
yield UploadDataError(errorMessage: storageEvent.error);
}
if (storageEvent.type == StorageEventType.success) {
yield UploadDataSuccess();
}
if (storageEvent.type == StorageEventType.progress) {
yield UploadDataProgress(progress: storageEvent.progress);
}
}
}
}
这篇关于Dart从另一个流侦听器产生流事件的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!