使用registerFactory注册Bloc时,状态变量能否持久化?
Bloc依赖注入与实例共享问题
我在Bloc中使用依赖注入,初始化Bloc时调用以下代码:
getIt.registerFactory<RemoteGroceryItemsBloc>(() => RemoteGroceryItemsBloc(getIt(),getIt()));
我的操作流程如下:
- 调用服务拉取数据列表(执行
getIt()..add(event #1)); - 调用另一服务将新项保存到刚下载的列表(执行
getIt()..add(event #2)); - 将新项追加到步骤1的列表中;
- 当前问题是需要持久化步骤1的列表,才能在步骤2中完成追加操作;
- 我将列表保存在状态类中并传递给步骤2的用例(这么做是因为不想在UI中处理追加逻辑,只想将追加后的列表返回给UI)。
我的疑问是:如果使用factory类(每次调用都会创建新实例)注册Bloc,那么第二次调用(getIt()..add(event #2))如何访问步骤1中的原始列表?我是否忽略了某些关键点?
核心问题:Factory注册导致Bloc实例不共享
你现在的问题根源就是用了registerFactory——每次调用getIt<RemoteGroceryItemsBloc>()都会生成全新的Bloc实例,第二个实例根本没有步骤1中拉取的列表状态,自然没法完成追加操作。
解决方案:改用单例注册
把注册方式改成registerLazySingleton或registerSingleton,这样无论调用多少次getIt(),拿到的都是同一个Bloc实例:
// 懒加载单例(首次调用时才初始化) getIt.registerLazySingleton<RemoteGroceryItemsBloc>(() => RemoteGroceryItemsBloc(getIt(),getIt())); // 或者立即初始化的单例 getIt.registerSingleton<RemoteGroceryItemsBloc>(RemoteGroceryItemsBloc(getIt(),getIt()));
额外注意点
- 状态的自然复用:Bloc的状态本身保存在实例内部,只要是同一个实例,处理
event #2时就能直接通过state获取到步骤1拉取的列表,不需要额外把列表传递给用例。直接在Bloc的事件处理方法(on或mapEventToState,取决于Bloc版本)里读取当前状态的列表,追加新项后更新状态即可。 - 逻辑分层的合理性:你的思路是对的,业务逻辑应该留在Bloc层。调整注册方式后,同一个Bloc实例会依次处理两次事件,自然完成「拉取列表→追加新项→更新状态」的完整流程,UI只需要监听状态变化展示最终结果即可。
内容的提问来源于stack exchange,提问作者Mike6679
相关产品推荐
相关产品推荐

