最开始的目标是想使用MVC模式进行代码功能拆分和管理,参考了一些开源项目,在项目中发现使用了provider和get_it等库, 这两个库都是用来做状态管理的,所以进一步搜索资料,了解一下Flutter中的状态管理。
状态管理工具
setState
最为初级的状态管理方法,官方的Hello World示例用的就是这种方式,优点是简单,缺点嘛——参照其他状态管理的优点,那些都是针对这种方式的缺点改进的。
InheritedWidget 和 InheritedModel
ModelBinding就是这种方式,Provider其实也是这种方式。对 InheritedWidget 进行封装,实现数据在组件树上传递,进而达到状态数据共享和局部刷新的目的。
Provider
在 Pub 上最受欢迎的状态管理插件之一,凭借简洁、易用、高性能受到了很多 Flutter 开发者的喜爱,更是成为了官方首要推荐的状态管理工具。 Provider是在 InheritedWidget 基础上的封装,使用Provider具有如下特性:
- 简化资源的分配和销毁;
- 懒加载;
- 减少了大量创建状态管理相关类代码的工作;
- 通用的方式去消费 InheritedWidget 共享的数据;
- 对于复杂度显著上升的监听链路,提供了高可扩展性。
Riverpod
Provider的作者创建了Riverpod包,以 “做出一些本来不可能的改进”(用他自己的话说)
GetIt
GetIt 实际上是一个基于状态管理的服务管理工具,优点是不需要 BuildContext。如果想使用依赖注入、面向接口编程的方式来实现代码解耦和应用管理则十分适合。对应的 pub 包和文档如下:
- GetIt package:基础的服务管理工具,提供了容器帮助代码找到对应的服务提供对象。
- GetIt Mixin:GetIt 的扩展,使得 GetIt 可以完全应用于状态管理。
- GetIt Hooks:GetIt 的另一个扩展,可以用于 flutter_hooks 的场景。
- Flutter state management for minimalist:一篇介绍 Flutter 状态管理与应用架构的文章,值得仔细阅读。
GetX
一个简化的状态管理解决方案,pub 地址:GetX package。 GetX 是一个超轻量、但很强大的 Flutter 解决方案,提供了高性能的状态管理,智能依赖注入和快速可用的路由管理工具。 GetX由于简化了很多实现代码,目前的流行度已经超过了 Provider。
PS:好像GetX存在两个极端的评价,一个认为功能庞大,可以满足各种需求(状态管理、路由 等),另一个认为代码臃肿,降低了应用的运行效率。X上的讨论
MobX
基于观察者模式和响应式模式的状态管理库,GitHub 地址:MobX。 MobX 的目标是将应用的界面和响应式数据连接起来。这种方式是完全自动的,而且感觉很自然(类似双向绑定)。 对于开发者而言,只需要关注界面需要消费的响应式数据,而不用担心保持二者的同步。
Redux
类似 React 的状态管理工具Redux,本质上是一个状态容器,pub地址:Flutter-Redux package。 关键在于提供了3种 Widget:
StoreProvider:基础 Widget,它会把指定的Redux状态数据(Redux Store) 传递给需要的下级组件;StoreBuilder:一个从 StoreProvider 获取状态的下级组件,它会将获取到的状态传递给一个返回 Widget 的 builder 方法。StoreConnector:一个从最临近的 StoreProvider 祖先组件获取状态的下级组件,然后利用 指定的 converter将状态转换为 ViewModel 对象后给到 builder 方法。任何时候,状态发出一个更改事件后,该组件会被自动重建,从而无需主动管理事件订阅。
BLoC / Rx
一个基于Stream / Observable 范式的系列,关于介绍可以看官方的文档:Flutter BLoC。
Flutter Commands
基于 ValueNotifier,使用命令模式实现的响应式状态管理库。最佳的实践是与 GetIt 结合,也可以使用 Provider或其他容器配合。pub 地址:Flutter Command。
Binder
基于 InheritedWidget 的状态管理包,仿照的是recoil,目标是想将业务、状态和界面分离解耦,pub 地址:Binder package。
注意事项
由于 Dart 语言和 Javascript有很多共同之处,因此在 pub 上有很多类似 Javascript 的库,譬如 Redux,MobX 等。实际上,没有最好的状态管理工具,只有最合适的状态管理工具。具体如何选择可以参考以下几点:
- 更新维护及时性:Flutter 本身的迭代速度很快,因此有些插件如果不及时维护的话意味着你之后的代码全部需要更改,尤其是状态管理这类涉及到整个应用架构的插件。
- 使用者数量:可以通过 pub 的评分和 Github 的评分来评估使用者的情况,使用人数不多意味着你可能会需要自己踩坑排雷,对于自己玩的话无所谓,但是对于产品开发就可能会影响整个产品的开发进度。
- 团队适应性:如果是你一个人开发,那可以忽略这一点,但是如果团队有多人,那需要考虑一个大家都能够快速上手的插件。
- 原生依赖度:有不少插件是需要依赖原生的,而有些原生本身就是第三方的开源代码,如果这些开源代码停止维护了很可能导致 Flutter 的插件也无法更新。因此,除非是官方插件,对于第三方插件要特别小心,如果第三方插件依赖于原生甚至是第三方开源代码,那么就需要注意要慎重选择。如果可以,尽可能选择纯 Dart 的插件。
参考资料
- Flutter状态管理
- Flutter 入门与实战(四十):以购物车为例初探状态管理
- 九种顶级状态管理带你打开 Flutter 成神之门
- Flutter 入门与实战(四十六):状态管理有N 种写法,你知道么?
- 2021 年的 Flutter 状态管理:如何选择?

文档信息
- 本文作者:Bob.Zhu
- 本文链接:https://home.mytool.group/2024/08/15/02-flutter-state-management/
- 版权声明:自由转载-非商用-非衍生-保持署名(创意共享3.0许可证)

来源: