Flutter 状态管理框架 Provider 和 Get 分析

113 阅读5分钟

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):

声明式开发带来的问题

没有使用状态管理,直接「声明式」开发的时候,遇到的问题总结有三个:

  1. 逻辑和页面 UI 耦合,导致无法复用/单元测试、修改混乱等
  2. 难以跨组件 (跨页面) 访问数据
  3. 无法轻松的控制刷新范围 (页面 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 对本文的贡献。