BlocListener未监听当前屏幕事件:VerifyScreen操作触发RegistrationScreen监听器
问题原因
- 路由栈中RegistrationScreen未销毁:跳转VerifyScreen时如果使用
Navigator.push压栈操作而非Navigator.pushReplacement替换路由,RegistrationScreen会一直保留在路由栈中,它绑定的BlocListener也处于活跃状态,只要RegistrationCubit发出新状态,旧页面的Listener就会触发。 - VerifyScreen未正确订阅同一Cubit实例:如果
RegistrationCubit的BlocProvider仅包裹RegistrationScreen子树,那么VerifyScreen不属于该子树范围,无法获取到同一个Cubit实例,VerifyScreen中的BlocListener自然不会收到状态通知。 - 状态处理逻辑冲突:若旧页面Listener处理状态时执行了Cubit关闭、全局事件拦截等操作,也会导致新页面Listener无法正常响应状态。
修复方案
- 调整路由跳转逻辑:如果跳转VerifyScreen后不需要返回RegistrationScreen,改用
Navigator.pushReplacement替换路由,让RegistrationScreen正常销毁,其绑定的Listener也会同步卸载。 - 调整Cubit提供范围:将
RegistrationCubit的BlocProvider提到两个页面的共同父节点(如路由的上层节点),确保两个页面可以访问到同一个Cubit实例。 - 增加场景判断逻辑:如果需要保留两个页面同时在路由栈中,可以在Cubit的状态类中新增场景标识字段,两个页面的Listener处理状态前先校验场景标识,只处理当前页面对应的状态即可。
内容的提问来源于stack exchange,提问作者Gagan_iOS
相关产品推荐
相关产品推荐

