こんにちは私は他のブロックのブロックの状態の状態を聞きようとしています。私はこのパッケージを使っています https://pub.dev/packages/bloc
MyUserBloc私はlistenauthblocと状態があるときにAuthenticationAuthenticateduserblocはイベントを発射する必要があります。
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 = {AuthenticationAuthenticated} AuthenticationAuthenticated
props = {_ImmutableList} size = 0
_
しかし、StateAuthは認証認証常にfalseを返します。
他のBlocクラスからBlocStateを聴くための方法はありますか?
Sampirの質問に答えるために、はい、あなたは正しいですが、時にはあなたはそれを別の方法でやりたいと思うかもしれません。 Blocは他の誰かのためのイベントを管理するものです。あなたがUIイベントを使っていて、あなたのブロックはあなたのUIのためにそれらを管理していますが、他の種類のイベント(つまり、ポジションイベント、またはその他のストリームイベント)とも働いている場合は、UIイベントとAntoher Blocを管理するBlocを持つことができます。それは他の種類のイベント(つまりBluetooth接続)を管理します。そのため、最初のBlocは2番目のものを聴く必要があります(すなわち、Bluetooth接続を確立するのを待っているから)。たくさんのセンサーを使用するアプリについては、データのストリームを持つものがあり、協力しなければならないブロックのチェーンがあります。マルチプロバイダーとマルチリスナーでそれを行うことができますが、あなたのチェーンは非常に長くて、あなたのリスナーケースを書くことができます、あるいはあなたのUIからそれを隠したいのですが、あなたの別の部分でそれを再利用したい場合があります。アプリ、あなたはあなたのブロックの中にあなたのチェーンを作りたいかもしれません。
あなたはほとんどどこにでもブロックにリスナーを追加することができます。 StreamSubScriptionを使用すると、別のブロックの1つでも、すべての種類のストリームにリスナーを追加できます。 Blocは彼のストリームを公開する方法を持っている必要がありますので、あなたは彼に耳を傾けることができます。
いくつかのコード(私は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
}
_
BlocでBlocを持っているのはなぜですか?あなたのページの両方のブロックを使用してみてください、私はそれが素晴らしい仕事になるべきです。また、実装が非常に簡単、Blocは MultiBlocProvider