[英]How to listen to multiple stream subscriptions in a bloc?
我正在嘗試創建一個依賴於其他兩個集團的集團。 例如,我有Bloc C
,它取決於Bloc A
和Bloc B
。 我正在嘗試使用flutter_bloc執行以下操作以實現它:
class BlocC
extends Bloc< BlocCEvent, BlocCState> {
final BlocA blocA;
final BlocC blocB;
StreamSubscription blocASubscription;
StreamSubscription blocBSubscription;
BlocC({
@required this.blocA,
@required this.blocB,
}) : super((blocA.state is blocALoaded &&
blocB.state is blocBLoaded)
? BlocCLoaded(
blocA: (blocA.state as blocALoaded).arrayFromBlocA,
blocB:
(blocB.state as blocBLoaded).arrayFromBlocB,
)
: BlocCLoading()) {
blocASubscription = blocA.stream.listen((state) {
if (state is blocALoaded) {
add(BlocAUpdated((blocA.state as blocALoaded).arrayFromBlocA));
}
});
blocBSubscription = blocB.stream.listen((state) {
if (state is BlocBLoaded) {
add(BlocBUpdated((blocB.state as BlocBLoaded).arrayFromBlocB));
}
});
}
...
@override
Future<void> close() {
blocASubscription.cancel();
BlocBSubscription.cancel();
return super.close();
}
}
問題是我收到以下錯誤: Bad state: Stream has already been listened to
。 我在下一篇文章中找到了有關該錯誤的信息。
我知道錯誤正在發生,因為 stream 一次只能聽一個集團,而不是多個集團。 就我而言,當我嘗試收聽blocA
時, stream 已經在收聽blocB
。 但是,我不確定如何解決此問題。
我將非常感謝這方面的任何幫助。
您必須將兩個流合並為一個並根據事件類型采取行動:
import 'package:async/async.dart' show StreamGroup;
//...
final blocAStream = blocA.stream;
final blocBStream = blocB.stream;
var blocAandBStreams = StreamGroup.merge([blocAStream, blocBStream]);
blocAandBStream.listen((event){
if(event is BlocAState){
if (event is blocALoaded) { //<-- for readability
add(BlocAUpdated((blocA.state as blocALoaded).arrayFromBlocA));
}
}else if(event is BlocBState){
if (event is BlocBLoaded) {//<-- for readability
add(BlocBUpdated((blocB.state as BlocBLoaded).arrayFromBlocB));
}
}
})
我已經實現了事件總線模式來在塊之間進行通信。 這種方法的優點是您的塊實例不相互耦合,因此您不需要實例化或注入它們的實例按塊管理全局事件
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.