Flutter Cubit监听其他Cubit状态异常:首次更新后停止监听及refreshEvents注入时未执行问题排查
让我们一步步解决你的两个核心问题:
问题1:EventFilterCubit首次更新后停止监听状态变化
问题根源
你的Stream订阅回调里犯了一个关键错误:你使用了eventLoaderCubit.state和locationTrackerCubit.state,而非回调参数传入的state。当Cubit连续emit状态时,回调触发的瞬间,Cubit的当前状态可能已经发生了变化,这会导致类型转换失败并抛出异常,直接终止你的StreamSubscription——这就是为什么首次更新后监听就失效了。
修复方案
修改订阅逻辑,使用回调参数里的state确保拿到触发本次回调的准确状态:
eventsSubscription = eventLoaderCubit.stream.listen( (state) { if (state is EventsUpToDate) { print("Eventloaderbloc updated events"); // 改用回调传入的state,避免状态不一致 eventsUpdated(state.events); } }, ); locationSubscription = locationTrackerCubit.stream.listen( (state) { if (state is LocationLoadSuccess) { print("locationtrackercubit updated location"); // 同样使用回调的state locationUpdated(state.location); } }, );
同时记得在EventFilterCubit中添加close方法取消订阅,避免内存泄漏:
@override Future<void> close() { eventsSubscription?.cancel(); locationSubscription?.cancel(); return super.close(); }
问题2:EventLoaderCubit的refreshEvents()未执行
问题根源
你使用getIt<EventLoaderCubit>()获取实例,而getIt默认是单例模式——一旦实例被创建,后续调用都会返回同一个对象,构造函数只会执行一次。如果EventLoaderCubit在BlocProvider创建前就已经被初始化(比如被EventFilterCubit依赖提前创建),那么BlocProvider的create方法不会再次触发构造函数,自然不会执行refreshEvents()。
修复方案
有两种可选的解决方式:
- 显式调用refreshEvents()
不管实例是否已存在,在Provider创建时手动触发刷新:
BlocProvider<EventLoaderCubit>( create: (context) => getIt<EventLoaderCubit>()..refreshEvents(), ),
- 调整getIt注册为factory模式
如果你希望每次获取都创建新实例,修改依赖注入的注册代码:
getIt.registerFactory<EventLoaderCubit>(() => EventLoaderCubit(getIt<IEventRepository>()));
这样每次BlocProvider创建时都会得到新实例,构造函数中的refreshEvents()会自动执行。注意这种方式要符合你的业务逻辑,避免不必要的实例创建。
内容的提问来源于stack exchange,提问作者Andi
相关产品推荐
相关产品推荐

