这种情况通常是因为Bloc之间的通信出现问题,一个常见的解决方法是使用StreamSubscription来监听Bloc之间的通信。
示例代码:
在Bloc A中定义StreamController并添加StreamSubscription:
class BlocA extends Bloc {
final _controller = StreamController();
StreamSubscription? _subscription;
BlocA() : super(const BlocALoading()) {
_subscription = BlocProvider.of(context).stream.listen((event) {
if (event is BlocBEvent) {
// 处理事件
}
});
}
@override
Stream mapEventToState(BlocAEvent event) async* {
// 处理事件
}
@override
Future close() {
_subscription?.cancel();
_controller.close();
return super.close();
}
}
在Bloc B中暴露出Stream:
class BlocB extends Bloc {
final _controller = StreamController();
BlocB() : super(const BlocBLoading());
Stream get stream => _controller.stream;
@override
Stream mapEventToState(BlocBEvent event) async* {
// 处理事件
}
@override
Future close() {
_controller.close();
return super.close();
}
}
这样,在Bloc B中产生的事件会在Bloc A中被监听到,从而实现Bloc之间的通信。