16

こんにちは、他のブロックからブロックの状態を聞き取ろうとしています。このパッケージを使用していますhttps://pub.dev/packages/bloc

UserBlocからAuthBlocをリッスンしたいのですが、状態がAuthenticationAuthenticatedの場合、UserBlocはイベントを発生させる必要があります。

final UserRepository userRepository;
final authBloc;
StreamSubscription authSub;
UserBloc({ @required this.userRepository, @required this.authBloc}) {
    authSub = authBloc.listen((stateAuth) {

      //here is my problem because stateAuth, even is AuthenticationAuthenticated it return always false.
      if (stateAuth is AuthenticationAuthenticated) {
        this.add(GetUser())  ;
      }
    });
  }

@override
  Future<void> close() async {
    authSub?.cancel();
    super.close();
  }

今のところ、私はこの問題を抱えています:デバッグ中にstateAuthを出力しようとすると、次のように返されます:

stateAuth = {AuthenticationAuthenticated} AuthenticationAuthenticated
   props = {_ImmutableList} size = 0

ただし、stateAuth は AuthenticationAuthenticated であり、常に false を返します。

BlocState From Other Bloc クラスをリッスンする方法はありますか?

4

2 に答える 2

16

Sampir の質問に答えるには、そのとおりですが、別の方法でやりたい場合もあります。ブロックとは、他の誰かのためにイベントを管理するものです。UIイベントを操作している場合、ブロックはUIのためにそれらを管理しますが、他の種類のイベント(つまり、位置イベント、または他のストリームイベント)も操作している場合、UIイベントと別のブロックを管理するブロックを持つことができます他の種類のイベント (つまり、Bluetooth 接続) を管理します。したがって、最初のブロックは 2 番目のブロックをリッスンする必要があります (つまり、Bluetooth 接続の確立を待機しているため)。多数のセンサーを使用するアプリを考えてみてください。それぞれにデータ ストリームがあり、連携しなければならないブロックのチェーンができます。

ブロックのほぼどこにでもリスナーを追加できます。StreamSubscription を使用すると、別のブロックのストリームであっても、あらゆる種類のストリームにリスナーを追加できます。ブロックには、彼のストリームを公開する方法が必要です。これにより、彼の話を聞くことができます。

いくつかのコード (私は flutter_bloc を使用します - flutter_bloc にはマルチプロバイダーがありますが、これは単なる例です):

class BlocA extends Bloc<EventA, StateA> {

  final BlocB blocB;
  StreamSubscription subscription;

  BlocA({this.blocB}) {
    if (blocB == null) return;
    subscription = blocB.listen((stateB) {
      //here logic based on different children of StateB
    });
  }

  //...

}

class BlocB extends Bloc<EventB, StateB> {
   //here BlocB logic and activities
}
于 2020-05-11T08:54:26.670 に答える