Bloc Listener无法监听cubit状态变化,编辑车辆后广告页未更新
BlocListener未监听到Cubit状态变更的排查方案
以下为接手存量项目时该问题的常见原因:
- Cubit实例不匹配
你在广告页监听的EditCarCubit实例,和编辑页实际发起状态变更的EditCarCubit不是同一个实例。存量项目大概率将EditCarCubit的BlocProvider放在了编辑路由的局部节点下,编辑页关闭后该实例就被销毁,广告页监听的是父节点提供的另一个全局实例,自然收不到状态通知。需确认EditCarCubit的提供层级为广告页、编辑页的共同父节点,保证两边取用的是同一个实例。 - 状态类未正确实现相等判断
Bloc/Cubit基于状态值相等判断是否下发新状态,如果状态类没有继承Equatable、没有重写==和hashCode,或者状态属性没有全部放入props数组中,即使属性发生变更,Bloc也会判定为相同状态,不会触发BlocListener回调。
同时注意不要将可变对象(如未拷贝的List、Map)作为状态属性,直接修改原可变对象后emit,Bloc会判定对象引用未发生变化,不会触发状态更新。 BlocListener配置错误
第一要检查是否明确指定了BlocListener的泛型:BlocListener<EditCarCubit, EditCarState>,避免类型推断错误导致监听了其他Cubit的状态;第二要确认BlocListener所在的上下文可以正常获取到目标EditCarCubit实例,若上下文在BlocProvider的节点之外,无法获取到Cubit实例也不会触发监听。- Cubit被提前销毁
检查存量代码中是否存在编辑页弹出路由时主动调用EditCarCubit.close()的逻辑,Cubit被关闭后所有的状态emit都会被丢弃,自然不会触发监听回调。 - 相同状态被过滤
Bloc默认的transformer会过滤连续完全相同的状态,如果你两次编辑后emit的状态完全一致,第二次状态会被默认过滤不会触发监听。如果需要每次emit都触发回调,可以自定义transformer关闭去重逻辑。
内容的提问来源于stack exchange,提问作者Mo_
相关产品推荐
相关产品推荐

