簡體   English   中英

如何收聽多個 stream 訂閱?

[英]How to listen to multiple stream subscriptions in a bloc?

我正在嘗試創建一個依賴於其他兩個集團的集團。 例如,我有Bloc C ,它取決於Bloc ABloc 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM