TL;DR:有一种使用Cubit而不是BLoC监听流和发出状态的方法吗?
我使用BLoC库进行颤振,我们使用Cubit进行状态管理。到目前为止,对于获取数据或保存数据的交互来说,一切都是正常的,但是现在我需要处理流。在我的例子中,这意味着从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()));
}
});
}
}在使用BLoC时,只要从调用watchTalk()返回数据,就可以简单地使用async*和yield返回状态,因为mapEventToState()也是生成State的流。在Cubit的情况下,我们使用emit(MyState)获取UI中的状态,并且函数不是Stream类型的。我想知道的是,我们是否可以使用Cubit来处理流。
发布于 2021-02-28 06:03:30
如果有人像我一样被弄糊涂了,那就很简单了。您可以在每次从流中获得值时调用侦听您的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());
}
},
);
});
}https://stackoverflow.com/questions/66006767
复制相似问题