可能有许多BloC监听状态吗?

时间:2019-07-17 16:12:33

标签: flutter dart bloc

在没有任何答案的情况下询问Flutter(Difference between ChangeNotifierProvider and ScopedModel in Flutter)中的状态管理后,我决定使用BLoC Package,在我看来,{{3}}是最清晰,最容易使用的。 现在在我的flutter应用程序中,我有BlocA,BlocB和BlocC,我想从BlocC监听BlocA和BlocB的状态变化。

在所有集团上具有相同状态/事件的示例(更新,更新/更新):

class BlocC extends Bloc<CEvent, CState> {
  final BlocA a;
  final BlocB b;
  StreamSubscription aSubscription;

  BlocC({@required this.a, @required this.b}) {
    aSubscription = a.state.listen((state) {
      if (state is AUpdated) {
        dispatch(UpdateC());
      }
    });
  }

  @override
  CState get initialState => CUpdating();

  @override
  Stream<CState> mapEventToState(CEvent event) async* {
    if (event is UpdateC && b.currentState is BUpdated) {
      yield* CUpdated();
    }
  }
...

在这种情况下,从BlocA状态分派事件时,有时_mapEventToState方法中BlocB的状态未更新,并且我的侦听器不起作用。 因此,我认为有一种方法可以将集团订阅到许多流,以获取所有流的正确状态转换。

你能帮我吗?

1 个答案:

答案 0 :(得分:1)

这是预期的行为,因为仅当UpdateC()的状态为BlocA时分派AUpdated,而不是同时BlocB的状态也为{{1 }}。

即使您将BUpdatedBlocA的状态更改为同时更新的调度事件,这也是异步的,因此您不保证BlocB可以为真曾经。因此您丢失了一些event is UpdateC && b.currentState is BUpdated事件。

对于您的情况,可以使用rxdart的combineLastest2。并且仅在UpdateCUpdateC()同时处于BlocA状态时分派BlocB

Updated