You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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()));

额外注意点

  1. 状态的自然复用:Bloc的状态本身保存在实例内部,只要是同一个实例,处理event #2时就能直接通过state获取到步骤1拉取的列表,不需要额外把列表传递给用例。直接在Bloc的事件处理方法(on或mapEventToState,取决于Bloc版本)里读取当前状态的列表,追加新项后更新状态即可。
  2. 逻辑分层的合理性:你的思路是对的,业务逻辑应该留在Bloc层。调整注册方式后,同一个Bloc实例会依次处理两次事件,自然完成「拉取列表→追加新项→更新状态」的完整流程,UI只需要监听状态变化展示最终结果即可。

内容的提问来源于stack exchange,提问作者Mike6679

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.23 19:32:12