跨页面/BLoC事件传递最佳实践:新增排行榜状态同步方案
排行榜新增功能的BLoC方案分析
遗漏的可行方案
- 全局Event Bus事件通信:注册一个全局事件总线,LeaderboardNewBloc完成提交后发送新增成功事件,LeaderboardListBloc监听该事件,触发列表刷新和SnackBar提示。
- Navigator返回值传递:打开Dialog时用
await Navigator.push获取返回结果,在列表页的回调里处理加载状态结束、关闭Dialog、显示SnackBar并刷新列表。 - 共享Repository状态流:让两个Bloc依赖同一个Repository,Repository内部维护状态流,LeaderboardNewBloc调用新增接口后,Repository推送状态更新,LeaderboardListBloc监听这个流来同步列表数据。
首选方案
首选在Dialog上层提供LeaderboardListBloc并添加特定事件,理由如下:
- 完全保留现有模块划分,不用调整架构,LeaderboardList和LeaderboardNew模块各自保持独立职责。
- 逻辑链路清晰:新增操作的结果直接通知List Bloc,由List Bloc统一负责列表更新、SnackBar显示,职责边界明确。
- 实现成本低,不需要额外引入全局工具或新增上层组件,避免了不必要的复杂度。
场景与方案选择逻辑
当前简单场景
优先选直接依赖目标Bloc添加事件或Navigator返回值,核心是尽量少改动现有结构,降低实现成本,同时保证逻辑清晰。
中等复杂度场景(多模块交互)
比如多个子模块需要同步数据状态,优先用共享Repository状态流:把业务逻辑下沉到Repository层,Bloc只做状态转换,既降低模块耦合,又能保证状态同步的一致性。
复杂全局场景(跨无关模块通信)
如果多个没有直接依赖的模块需要传递事件,再考虑Event Bus,但要注意统一事件命名规范,避免事件泛滥导致后期维护混乱。
高耦合业务场景
只有当多个操作需要统一调度、业务逻辑高度关联时,才考虑新增上层BLoC,但这种方案会增加架构复杂度,需谨慎使用。
避坑提醒
不要选将LeaderboardNewBloc提至LeaderboardList上层,这种做法会打破模块的单一职责,导致上层Bloc臃肿,后续扩展和维护都会变得困难。
内容的提问来源于stack exchange,提问作者Ortes
相关产品推荐
相关产品推荐

