使用 Cubit(BLoC 库)观察流?

kob*_*owo 10 flutter bloc

TL;DR:有没有一种方法可以监听流并使用Cubit而不是发出状态BLoC

我正在使用BLoCFlutter 库,我们使用Cubits 进行状态管理。到目前为止,获取数据或保存数据的交互一切正常,但现在我需要使用流。就我而言,这意味着观看来自 的快照FirebaseFirestore

我尝试在互联网上搜索是否有方法观察流而Cubit不是使用BLoC,但大多数结果都指向我BLoC。我曾在另一个项目中工作过BLoC,所以我知道如何使用它来观察流,但Cubit如果有办法的话我想使用它。

以下是我在 FireStore 中观察的代码示例:

@override
  Stream<Either<Failure, List<MTalk>>> watchTalk() async* {
    const path ='path/to/talks';
    yield* firestore
        .collection(path)
        .snapshots()
        .map(
          (snap) => right<Failure, List<MTalk>>(
            snap.docs
                .map(
                    (documentSnapshot) => MTalk.fromFirestore(documentSnapshot))
                .toList(),
          ),
        )
        .onErrorReturnWith((e) {
      if (e is FirestoreException) {
        return left(RetrieveFailure(message: e.message));
      } else {
        return left(UnknownFailure(message: e.toString()));
      }
    });
  }
}
Run Code Online (Sandbox Code Playgroud)

使用时BLoC,只要从调用返回数据,您就可以简单地使用async*yield返回状态watchTalk(),因为mapEventToState()它也是一个产生 的 Stream State。在 的情况下Cubit,我们使用emit(MyState)来获取 UI 中的状态,并且函数的类型不是Stream。我想知道的是我们是否可以使用Cubit流来工作。

kob*_*owo 5

如果有人像我一样感到困惑,这非常简单。cubit每次从流中获取值时,您都可以调用监听并发出状态。这是我的代码使用以下命令监听网络连接变化的示例DataConnectionChecker

///Listens to the connectivity of
Future<void> listenToConnectivity() async {
  if (_internetStream != null) {
    await _internetStream.cancel();
  }
  _internetStream = repo.isConnectedToInternet().listen((result) {
    result.fold(
      (failure) => _processFailure(failure: failure),
      (isConnected) {
        if (isConnected) {
          emit(const SessionState.connected());
        } else {
          emit(const SessionState.disconnected());
        }
      },
    );
  });
}
Run Code Online (Sandbox Code Playgroud)