Dart从另一个流侦听器产生流事件

时间:2019-05-08 08:26:52

标签: dart flutter stream

我有一个生成特定事件stream的函数。现在,我有一个来自存储服务的流,它具有自己的事件。寻找一种在storage stream中发生变化时产生事件的方式。

此代码段无法解决问题。

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);
      }
    });
  }
}

输出: 调试打印有效,但事件不会发送给侦听器。

***** Listener: StorageEventType.progress - 0.01924033836457124
***** Listener: StorageEventType.progress - 0.044581091468101464
***** Listener: StorageEventType.progress - 0.6986233206170177
***** Listener: StorageEventType.progress - 1.0

1 个答案:

答案 0 :(得分:1)

值得。我有一个类似的问题,我正在订购Firebase快照,并试图根据文档数据产生事件。

如果我使用了等待模式,那么我将没有订阅处理。结果,当我想关闭BLoC时停止阅读流变得很痛苦。

我找到了一个解决方案。

Stream<BlocState> mapEventToState(BlocEvent event) async* {
  if (event is FetchEvent) {
    yield LoadingState();
    _subscription = SomeStream(event.someKey).listen((snapshot) {
      add(OnSnapshotEvent(snapshot));
    });
  }

  if (event is OnSnapshotEvent) {
    if (SomeCondition(event.snapshot)) {
      yield SomeResultState();
    } else {
      yield SomeOtherState();
    }
  }
}

这样,我就可以处理订阅了,因此我可以随时清理。