Architecture Flutter App the Bloc_Redux Way
内容提要
本文讨论了 Flutter 中的状态管理方案:flutter_redux 和 flutter_bloc。flutter_redux 是 Redux 在 Flutter 的实现,但效率较低;而 flutter_bloc 复杂度高且处理状态时存在不足。作者提出了 Bloc_Redux 解决方案,通过将状态分为输入和输出,利用 StreamBuilder 提高效率,使组件更灵活地响应状态变化。
延伸解读
现有状态管理方案的效率瓶颈
文章指出,flutter_redux 和 flutter_bloc 在状态更新时都可能触发不必要的组件重建。flutter_redux 的 StoreConnector 只要 reducer 更新 state,所有消费该 Store 的 Connector 都会 rebuild,即使只改了一个属性;而 flutter_bloc 在添加新 state 时甚至没有做相等判断。这会导致性能下降,尤其当状态树较大时。
Bloc_Redux 的设计思路
作者提出的 Bloc_Redux 将状态分为输入(StateInput)和输出(StateOutput)。输入由 Bloc 处理,用于更新 Stream;输出是 Stream,供 Widget 通过 StreamBuilder 监听。这样 Widget 可以自行选择监听哪些流,只有相关流变化时才重建,避免了全量更新。Store 负责分发 action 给所有 Bloc,Bloc 更新输入流,输出流随之变化。
与 flutter_bloc 的复杂度对比
flutter_bloc 引入了 BlocSupervisor、BlocDelegate、Transition 等概念,增加了理解难度,且多个 bloc 一起使用时,开发者需要决定 action 分发给哪个 bloc。Bloc_Redux 则简化了这些概念,Store 统一分发 action,所有 Bloc 都会处理,Bloc 内部根据 action 类型决定是否更新状态,减少了使用上的心智负担。
资源管理与生命周期
Bloc_Redux 中,StateInput 实现了 Disposable 接口,Store 也实现了 Disposable。当 Store 被放入 StoreProvider 并在组件树中销毁时,会调用 dispose 方法,进而关闭所有 StreamController,避免内存泄漏。这解决了 Stream 资源需要手动管理的问题,使状态管理更安全。
Q&A
什么是 flutter_redux?
flutter_redux 是 Redux 在 Flutter 的官方实现,由 StoreProvider 和 StoreConnector 组成,但效率较低。
flutter_bloc 的复杂性体现在什么方面?
flutter_bloc 的复杂性体现在增加了新的概念,如 BlocSupervisor 和 BlocDelegate,且在处理状态时没有进行有效的状态比较。
Bloc_Redux 解决方案是如何提高效率的?
Bloc_Redux 通过将状态分为输入和输出,利用 StreamBuilder 让组件更灵活地响应状态变化,从而提高效率。
为什么 flutter_redux 和 flutter_bloc 无法高效处理状态变化?
因为这两者在状态更新时会导致所有连接的组件重新构建,无法有效区分状态变化的属性。
Bloc_Redux 如何简化状态管理的复杂性?
Bloc_Redux 通过将状态处理者分为多个 Bloc,简化了状态管理的复杂性,使得每个 Bloc 只关注特定的状态变化。
在 Bloc_Redux 中,Store 的角色是什么?
在 Bloc_Redux 中,Store 负责接收信息并做出决策,同时管理多个 Bloc 的状态更新。