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流来工作。
如果有人像我一样感到困惑,这非常简单。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)
| 归档时间: |
|
| 查看次数: |
4218 次 |
| 最近记录: |