こんにちは、私は他のブロックからブロックの状態を聞こうとしています。私はこのパッケージを使用していますhttps://pub.dev/packages/bloc
私からユーザーブロック聞きたいオーソブロックそしてそれが状態にあるとき認証認証済みのユーザーブロックイベントを発生させる必要があります。
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 を返します。
他の Bloc クラスから blocState をリッスンする方法はありますか?
ベストアンサー1
Sampir の質問にお答えすると、はい、その通りですが、別の方法で実行したい場合もあります。ブロックは、他の誰かのイベントを管理するものです。UI イベントを扱っている場合、ブロックは UI のイベントを管理しますが、他の種類のイベント (位置イベントや他のストリーム イベントなど) も扱っている場合は、UI イベントを管理するブロックと、他の種類のイベント (Bluetooth 接続など) を管理する別のブロックを持つことができます。したがって、最初のブロックは 2 番目のブロックをリッスンする必要があります (Bluetooth 接続の確立を待機しているため)。多数のセンサーを使用し、それぞれにデータのストリームがあるアプリについて考えてみると、連携する必要があるブロックのチェーンができます。マルチプロバイダーとマルチリスナーでこれを行うことはできますが、チェーンが非常に長くなり、リスナーケースの記述が困難になる可能性があります。また、UI から非表示にしたり、アプリの別の部分で再利用したりする必要があるため、ブロック内にチェーンを構築する必要があるかもしれません。
ブロックのほぼどこにでもリスナーを追加できます。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
}