关于Bloc使用的疑问:是否应为每个待办事项创建独立Bloc实例?
是否应该创建同一个Bloc的多个实例?
针对你的待办事项列表场景,两种方案都有适用场景,具体看业务需求:
每个TodoItem单独使用TodoBloc实例(你的当前写法)
这种方案完全可行,适合以下情况:
- 每个待办项的状态完全独立,比如单独处理单个todo的编辑状态、加载状态(修改单个todo的完成状态、加载详情),不需要和其他待办项共享状态
- 每个TodoBloc只负责对应todo的业务逻辑,代码逻辑更聚焦,避免单个Bloc因管理所有todo而臃肿复杂
- 你的代码写法是正确的:通过
BlocProvider为每个TodoItem子树提供独立的TodoBloc实例,TodoItem可以在内部直接获取自己对应的Bloc处理业务
你的代码示例:
todos.map((e) { return Padding( padding: const EdgeInsets.only(bottom: 8.0), child: BlocProvider( create: (context) => TodoBloc(), child: TodoItem(todo: e), ), ); }).toList(),
所有待办项放在同一个Bloc中(比如TodosBloc)
如果业务涉及跨待办项的状态联动或全局操作,更适合用这种方案,比如:
- 需要批量操作:全选、批量删除、批量修改完成状态
- 需要统计全局数据:已完成待办项数量、总待办数
- 需要全局过滤:只显示已完成/未完成的待办项
- 待办项之间有状态依赖:某个todo的状态变化会影响其他todo的展示
这种情况下,统一的TodosBloc会在状态中维护整个todo列表,通过不同事件区分操作类型(比如UpdateTodoEvent、DeleteTodoEvent、ToggleAllTodoEvent),逻辑更集中,也避免了多个Bloc之间的状态同步问题。
总结建议
- 若只是单个todo的独立操作,优先用单个TodoBloc实例的方案,代码更清晰易维护
- 若涉及全局列表层面的操作,选择统一的TodosBloc方案,避免状态分散带来的同步问题
内容的提问来源于stack exchange,提问作者Coder
相关产品推荐
相关产品推荐

