Flutter 入门与实战(四十六):状态管理有N 种写法,你知道么?

这是我参与8月更文挑战的第9天,活动详情查看:8月更文挑战前端

楔子

话说孔乙己转行作了程序员,听闻近年来大前端比较火,也跟风学了一阵。什么 Vue,React,Angular 都了解一点。这段时间,行业巨头谷歌出了个 Flutter,号称要一套代码搞定整个前端,孔乙己天然不肯放过。git

这天孔乙己逛到了掘金社区,里面大佬太多,他怕本身太业余露馅。知道不能和他们谈天,便只好向初学者说话。有一回在个人评论区问道,“你学过 Flutter么?” 我略略回了个表情。 他说,“学过,……我便考你一考。Flutter的状态管理,怎样写的?” 我想,水平和我同样的人,也配考我么?便没有回消息,再也不理会。 孔乙己等了许久,再一次评论道,“不能写罢?……我教给你,记着!Flutter 状态管理应该这样写。未来作高级工程师的时候,作架构要用。” 我暗想我和高级工程师的等级还很远呢,并且咱们总监也从不用 Flutter 开发应用;又可笑,又不耐烦,懒懒的答他道,“谁要你教,不就是用一个 setState 方法么?” 孔乙己显出极高兴的样子,发了一个 耶的胜利表情,点头说,“对呀对呀!……状态管理有N 种写法,你知道么?” 我天然是没有回答,但他本身却真的列了出来。程序员

Provider

在 Pub 上最受欢迎的状态管理插件之一,凭借简洁、易用、高性能受到了不少 Flutter 开发者的喜好,更是成为了官方首要推荐的状态管理工具。咱们在Flutter 入门与实战(四十):以购物车为例初探状态管理其实已经介绍过。插件pub地址:Provider package。本质上,Provider是在 InheritedWidget 基础上的封装,使用Provider具备以下特性:github

  • 简化资源的分配和销毁;
  • 懒加载;
  • 减小了大量建立状态管理相关类代码的工做;
  • 通用的方式去消费 InheritedWidget 共享的数据;
  • 对于复杂度显著上升的监听链路,提供了高可扩展性。

setState

最为初级的状态管理方法,官方的Hello World示例用的就是这种方式,优势是简单,缺点嘛——参照其余状态管理的优势,那些都是针对这种方式的缺点改进的。编程

InheritedWidget 和 InheritedModel

前面介绍的 ModelBinding就是这种方式,Provider其实也是这种方式。对 InheritedWidget 进行封装,实现数据在组件树上传递,进而达到状态数据共享和局部刷新的目的。redux

Redux

相似 React 的状态管理工具Redux,本质上是一个状态容器,pub地址:Flutter-Redux package。关键在于提供了3种 Widget微信

  • StoreProvider:基础 Widget,它会把指定的Redux状态数据(Redux Store) 传递给须要的下级组件;
  • StoreBuilder:一个从 StoreProvider 获取状态的下级组件,它会将获取到的状态传递给一个返回 Widgetbuilder 方法。
  • StoreConnector:一个从最临近的 StoreProvider 祖先组件获取状态的下级组件,而后利用 指定的 converter将状态转换为 ViewModel 对象后给到 builder 方法。任什么时候候,状态发出一个更改事件后,该组件会被自动重建,从而无需主动管理事件订阅。

Fish Redux

闲鱼出品的一个基于 Redux 的总体应用框架,对于构建大中型应用来讲很合适,pub 地址:Fish-Redux package。与 Redux 的区别是,Fish Redux 是一个应用框架,解决了如应用分治、通讯、数据驱动、解耦等问题。做为一个应用框架,优势是能够为团队创建一套统一的规范,固然缺点也有,好比对于小应用来讲可能过于庞大,灵活性不足,可能会影响开阀发效率。markdown

BLoC / Rx

一个基于Stream / Observable 范式的系列,关于介绍能够看官方的文档:Flutter BLoC架构

GetIt

GetIt 其实是一个基于状态管理的服务管理工具,优势是不须要 BuildContext。若是想使用依赖注入、面向接口编程的方式来实现代码解耦和应用管理则十分适合。对应的 pub 包和文档以下:app

  • GetIt package:基础的服务管理工具,提供了容器帮助代码找到对应的服务提供对象。
  • GetIt Mixin:GetIt 的扩展,使得 GetIt 能够彻底应用于状态管理。
  • GetIt Hooks:GetIt 的另外一个扩展,能够用于 flutter_hooks 的场景。
  • Flutter state management for minimalist:一篇介绍 Flutter 状态管理与应用架构的文章,值得仔细阅读。

MobX

基于观察者模式和响应式模式的状态管理库,GitHub 地址:MobX。 MobX 的目标是将应用的界面和响应式数据链接起来。这种方式是彻底自动的,并且感受很天然(相似双向绑定)。对于开发者而言,只须要关注界面须要消费的响应式数据,而不用担忧保持两者的同步。

Flutter Commands

基于 ValueNotifier,使用命令模式实现的响应式状态管理库。最佳的实践是与 GetIt 结合,也可使用 Provider或其余容器配合。pub 地址:Flutter Command

Binder

基于 InheritedWidget 的状态管理包,仿照的是recoil,目标是想将业务、状态和界面分离解耦,pub 地址:Binder packageimage.png

GetX

一个简化的状态管理解决方案,pub 地址:GetX package。GetX 是一个超轻量、但很强大的 Flutter 解决方案,提供了高性能的状态管理,智能依赖注入和快速可用的路由管理工具。GetX因为简化了不少实现代码,目前的流行度已经超过了 Provider。

States Rebuilder

States Rebuilder 是高性能,知足预期和可控的状态管理工具。支持可变和不可变的状态,实现了严格的状态控制,而且支持自动清除状态。并且还能够在 StatelessWidget 中使用 setState(状态数据模型类的 setState,) 更新界面,一样也支持无需 BuildContext 的页面导航和消息提示。GitHub 地址: States Rebuilder

尾声

等到孔乙己写完以后,我居然有点惊到了,难道这些他都会?但碍于颜面,又很差意思问他。只好本身按照他写的那些去搜了一下。至于他是否是都会,也就无从知道了!

总结

因为 Dart 语言和 Javascript有不少共同之处,所以在 pub 上有不少相似 Javascript 的库,譬如 Redux,MobX 等。实际上,没有最好的状态管理工具,只有最合适的状态管理工具。具体如何选择能够参考如下几点:

  • 更新维护及时性:Flutter 自己的迭代速度很快,所以有些插件若是不及时维护的话意味着你以后的代码所有须要更改,尤为是状态管理这类涉及到整个应用架构的插件。
  • 使用者数量:能够经过 pub 的评分和 Github 的评分来评估使用者的状况,使用人数很少意味着你可能会须要本身踩坑排雷,对于本身玩的话无所谓,可是对于产品开发就可能会影响整个产品的开发进度。
  • 团队适应性:若是是你一我的开发,那能够忽略这一点,可是若是团队有多人,那须要考虑一个你们都可以快速上手的插件。
  • 原生依赖度:有很多插件是须要依赖原生的,而有些原生自己就是第三方的开源代码,若是这些开源代码中止维护了极可能致使 Flutter 的插件也没法更新。所以,除非是官方插件,对于第三方插件要特别当心,若是第三方插件依赖于原生甚至是第三方开源代码,那么就须要注意要慎重选择。若是能够,尽量选择纯 Dart 的插件。

我是岛上码农,微信公众号同名,这是Flutter 入门与实战的专栏文章。

👍🏻:以为有收获请点个赞鼓励一下!

🌟:收藏文章,方便回看哦!

💬:评论交流,互相进步!

相关文章
相关标签/搜索