Flutter 状态管理框架选择指南
文/ Nayuta,CFUG 社区
状态管理一直是 Flutter 开发中一个火热的话题。谈到状态管理框架,社区也有诸如有以 Get、Provider 为代表的多种方案,它们有各自的优缺点。面对这么多的选择,你可能会想:「我需要使用状态管理么?哪种框架更适合我?」本文将从作者的实际开发经验出发,分析状态管理解决的问题以及思路,希望能帮助你做出选择。
为什么需要状态管理?
首先,为什么需要状态管理?根据笔者的经验,这是因为 Flutter 基于声明式构建 UI,使用状态管理的目的之一就是解决「声明式」开发带来的问题。
「声明式」开发是一种区别于传原生的方式,所以我们没有在原生开发中听到过状态管理,那如何理解「声明式」开发呢?
「声明式」VS「命令式」分析
以最经典的的计数器例子分析:
通过计数器 app 理解 Flutter 的「声明式」和「命令式」
在 Flutter 中,我们只需要使变量增加之后调用 setState((){}) 即可。setState 会刷新整个页面,使得中间展示的值进行变更。
// 一、声明变量
int _counter =0;
// 二、展示变量
Text('$_counter')
// 三、变量增加,更新界面
setState(() {
_counter++;
});
可以发现,Flutter 中只对 _counter 属性进行了修改,并没有对 Text 组件进行任何的操作,整个界面随着状态的改变而改变。
所以在 Flutter 中有这么一种说法: UI = f(state):
声明式开发带来的问题
没有使用状态管理,直接「声明式」开发的时候,遇到的问题总结有三个:
- 逻辑和页面 UI 耦合,导致无法复用/单元测试、修改混乱等
- 难以跨组件 (跨页面) 访问数据
- 无法轻松的控制刷新范围 (页面 setState 的变化会导致全局页面的变化)
Provider、Get 状态管理框架设计分析
Flutter 中状态管理框架的核心在于这三个问题的解决思路,下面一起看看 Provider、Get 是如何解决的:
解决逻辑和页面 UI 耦合问题
这也是 Flutter 中几乎所有状态管理框架的解决思路,上图的 Presenter 你可以认为是 Get 中的 GetController、Provider 中的 ChangeNotifier 或者 Bloc 中的 Bloc。
解决难以跨组件 (跨页面) 访问数据的问题
这个问题其实和上一部分的思考基本类似,所以我们可以总结一下两种方案特点:
Provider
- 依赖树机制,必须基于 context
- 提供了子组件访问上层的能力
Get
- 全局单例,任意位置可以存取
- 存在类型重复,内存回收问题
解决高层级 setState 引起不必要刷新的问题
最后就是我们提到的高层级 setState 引起不必要刷新的问题,Flutter 通过采用观察者模式解决。
实践中的常见问题
在使用这些框架过程中,可能会遇到以下的问题:
Provider 中 context 层级过高
Get 由于全局单例带来的问题
正如前面提到 Get 通过全局单例,默认以 runtimeType 为 key 进行对象的存储,部分场景可能获取到的对象不符合预期。
Get 与 Provider 优缺点总结
通过本文,我向大家介绍了状态管理的必要性、它解决了 Flutter 开发中的哪些问题以及是如何解决的,与此同时,我也为大家总结了在实践中常见的问题等,看到这里你可能还会有些疑惑,到底是否需要使用状态管理?
在我看来,框架是为了解决问题而存在。所以这取决于你是否也在经历一开始提出的那些问题。如果有,那么你可以尝试使用状态管理解决;如果没有,则没必要过度设计,为了使用而使用。
其次,如果使用状态管理,那么 Get 和 Provider 哪个更好?
这两个框架各有优缺点,我认为如果你或者你的团队刚接触 Flutter,使用 Provider 能帮助你们更快理解 Flutter 的核心机制。而如果已经对 Flutter 的原理有了解,Get 丰富的功能和简洁的 API,则能帮助你很好地提高开发效率。
开发工具推荐
在开发 Flutter 应用时,除了状态管理框架的选择外,开发者还需要考虑应用的打包和发布流程。AppUploader 是一款优秀的 iOS 应用开发助手工具,可以帮助开发者更高效地完成应用的打包、上传和发布工作。
AppUploader 主要功能包括:
- 一键打包 iOS 应用
- 简化 App Store 上传流程
- 提供证书管理功能
- 支持多种构建环境配置
对于 Flutter 开发者来说,使用 AppUploader 可以节省大量在应用发布环节的时间,让开发者能更专注于应用本身的开发和优化。特别是在需要频繁测试和迭代的情况下,AppUploader 的自动化流程能显著提高开发效率。
感谢社区成员 Alex、Luke、Lynn、Ming 对本文的贡献。