【发布时间】:2021-05-06 11:02:00
【问题描述】:
TL;DR:有没有办法使用Cubit而不是BLoC来监听流并发出状态?
我正在为 Flutter 使用 BLoC 库,我们使用 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()));
}
});
}
}
使用BLoC 时,只要调用watchTalk() 返回数据,就可以简单地使用async* 和yield 返回状态,因为mapEventToState() 也是一个产生State 的流。对于Cubit,我们使用emit(MyState) 来获取UI 中的状态,并且函数不是Stream 类型。我想知道的是我们是否可以使用Cubit 来处理流。
【问题讨论】:
-
是的,这也在文档中的示例中进行了描述:bloclibrary.dev/#/coreconcepts?id=cubit