• 为什么需要状态管理
  • provider
  • bloc
  • redux
  • 对比
  • 总结

为什么需要状态管理

在了解和进行Flutter状态管理框架对比之前呢,我们先来问自己一个问题:为什么需要状态管理?

如果我们的应用足够简单,Flutter作为一个声明式框架,我们或许只需要将数据映射成视图就可以了。我们可能并不需要状态管理,就像下面这张图:

但是随着功能的增加,我们的应用程序将会有几十个甚至上百个状态。这个时候我们的应用将会变成这样:

在这种情况下我们很难再清楚的测试维护我们的状态,因为它看上去实在是太复杂了!而且还会有多个页面共享同一个状态。这个时候如果想在详情页改变一个模型的状态比如点赞收藏,在返回到列表时能够及时更新这个状态,在默认情况下是很难实现的。

整个问题出在Flutter为我们提供的状态管理方式:StatefulWidget。因为State 属于某一个特定的 Widget,在多个 Widget 之间进行交流的时候,虽然你可以使用callback 解决,但是当嵌套足够深的话,那么将进入callback传递的地狱。
这时候,我们便迫切的需要一个架构来帮助我们理清这些关系,并且轻松实现状态的管理和共享,这个时候我们就需要用到状态管理框了。

provider

provider是基于InheritedWidget的包装,通过使用provider而不是手动编写InheritedWidget就可以实现页面和其子页面间的数据共享。

provider是Flutter Favorite中的插件之一,也是目前
Flutter官方推荐和使用最多的状态管理框架。

provider提供的主要功能有:

  • 简化的资源分配与处置
  • 懒加载
  • 相较于每次创建一个新类,大大减少模板代码量
  • 对开发者工具更为友好
  • 更通用的消费 InheritedWidget 的方式(见 Provider.of/Consumer/Selector )
  • 提升类的可伸缩性,整体的监听架构(listening mechanism)时间复杂度以指数级增长(如ChangeNotifier, 其复杂度为O(N²))

建议之前还没接触过provider小伙伴,可以通过Flutter官网的这个simple以及官方文API说明来练习下对provider的使用,以方便后面课程的学习。

bloc

BLoC全称(Business Logic Component)是谷歌提出的一种设计模式,利用流的方式实现界面的异步渲染和重绘,我们可以非常快速的通过BLoC实现业务与界面的分离。

BLoC只是一种设计模式,不包含任何代码,所以要在Flutter中实现BLoC设计模式需要借助flutter_bloc这个库来完成。

flutter_bloc是一个可预测的状态管理库,可帮助我们实现BLoC(业务逻辑组件)设计模式。

BLoC设计模式有助于将UI与业务逻辑分开。遵循BLoC模式有利于项目的可测试性和可重用性。在BLoC中有个非常重要的概念:Cubit

Cubit

Cubit是Bloc的基础(也可以说是Bloc基于Cubit)。Cubit是一种特殊类型Stream,可以扩展以及管理任何类型的状态。Cubit需要一个初始状态,该状态将是emit被调用之前的状态。cubit的当前状态可以通过state来获取,并且可以通过emit
来生成一个新的state来达到更新cubit状态的目的:

cubit状态更改始于预定义的函数调用,这些函数可以使用该emit方法输出新状态。onChange在每个状态更改时调用,并包含当前状态和下一个状态。

bloc设计模式感兴趣的小伙伴可以通过flutter_bloc的example获取具体的用例。

Redux

接下来我们说说Redux,说到Redux 前端小伙伴一定都不陌生,Redux 是 JavaScript 状态容器,提供可预测化的状态管理,可以让你构建一致化的应用,运行于不同的环境(客户端、服务器、原生应用),并且易于测试。

Redux最为关键的就是它的数据流了:

redux数据流:

  • 用户(操作View)发出Action,发出方式就用到了dispatch方法;
  • 然后,Store自动调用Reducer,并且传入两个参数(当前State和收到的Action),Reducer会返回新的State,如果有Middleware,Store会将当前State和收到的Action传递给Middleware,Middleware会调用Reducer 然后返回新的State;
  • State一旦有变化,Store就会调用监听函数,来更新View;

到这儿为止,一次用户交互流程结束。可以看到,在整个流程中数据都是单向流动的。

与其说Redux是一个框架倒不如说Redux是一个设计思想,Redux在不同语言和框架中有不同的实现,比如在react-native可以借助中有react-redux来实现Redux。在Flutter中如果想使用Redux可以借助flutter_redux来完成。

总结

框架/方案 优点 缺点 使用建议
setState 无需引入依赖、使用简单 不支持页面间数据共享 适用于较小规模项目的状态基础管理方法
provider 基于InheritedWidget、简洁易用、Flutter官方推荐 只能实现页面和其子页面间的状态共享 中大型项目首选方案
bloc 能够很好地实现业务逻辑的复用以及视图与业务逻辑的分离 使用上结构相对复杂 在Flutter中除provider外,另一个不错的状态管理方案
redux 受众广、其它语言或框架也都有实现 概念较多比较难理解 如果之前使用过Redux并且不想引入provider的情况下

Flutter主流状态管理框架provider、bloc、redux对比相关推荐

  1. Flutter常用状态管理框架及优缺点

    Flutter 中常见的状态管理框架有以下几种: Provider: Provider 是一个轻量级的状态管理框架,可用于单个 Widget 或整个 Widget 树中分发状态.它通过 Inherit ...

  2. Flutter:状态管理(5) --BLoC

    应用的开发架构:BLoC 其意思是业务逻辑组件,其实就是把业务需要的一些逻辑单独拿出来放在一个类里面.这种类就叫Bloc 可以使用这种架构创建反应式的应用. 这种架构是Google发出来的,其开源AP ...

  3. FlyAI小课堂:Flutter 状态管理之BLoC

    在正式介绍 BLoC之前, 为什么我们需要状态管理.如果你已经对此十分清楚,那么建议直接跳过这一节. 如果我们的应用足够简单,Flutter 作为一个声明式框架,你或许只需要将 数据 映射成 视图 就 ...

  4. Flutter 状态管理之Bloc上

    前言:Flutter 的状态管理插件有很多,比如 Provider,GetX 还有本篇要讲述的 Bloc .Bloc 目前最新的版本是 flutter_bloc: ^8.0.1. BLoC 依赖 St ...

  5. 应用数据流状态管理框架Redux简介、设计思想、核心概念及工作流

    tip:有问题或者需要大厂内推的+我脉脉哦:丛培森 ٩( 'ω' )و [本文源址:http://blog.csdn.net/q1056843325/article/details/54784109 ...

  6. 状态管理框架开发不完全指南

    导读 之前在公司自研了一款状态管理框架,多多少少积累了一些写框架的经验,在这里分享给大家,题目想了挺久,因为文章篇幅比较长,但又没有一本书那么长.那么体系化,所以就起名叫不完全指南吧,一点拙见还请多指 ...

  7. Flutter GetX 状态管理 响应式编程(三)

    在码农的世界里,优美的应用体验,来源于程序员对细节的处理以及自我要求的境界,年轻人也是忙忙碌碌的码农中一员,每天.每周,都会留下一些脚印,就是这些创作的内容,有一种执着,就是不知为什么,如果你迷茫,不 ...

  8. Flutter GetX 状态管理 使用入门 程序计数器 (二)

    在码农的世界里,优美的应用体验,来源于程序员对细节的处理以及自我要求的境界,年轻人也是忙忙碌碌的码农中一员,每天.每周,都会留下一些脚印,就是这些创作的内容,有一种执着,就是不知为什么,如果你迷茫,不 ...

  9. Flutter - flutter_bloc状态管理

    继上一篇写了Flutter - GetX状态管理,会发现其实Flutter的状态管理的框架还是比较多的,用的比较多的有flutter_bloc.MobX.GetX等,今天我就来谈一谈我学习Flutte ...

最新文章

  1. Android Toolbar Padding
  2. 【Cocos2d实例教程一】xcode5下Cocos2d环境的搭建
  3. Python 21 Django 实用小案例1
  4. python 功能化模块_【软件测试教程】Python模块化以及内置模块的使用
  5. 从崩溃的选课系统,论为什么更安全的 HTTPS 协议没有被全面采用
  6. 【转】Qt QTableview使用
  7. Asp.net主题(theme)和皮肤(skin)的使用
  8. poj japan 数状数组解决逆序数
  9. Unity ECS 初探
  10. 产品经理数据分析入门
  11. java 项目视频教程_JAVA视频教程,真实项目,项目实战
  12. 华为设备配置基于MSDP的Anycast RP
  13. 计算机毕业论文外文译文,计算机毕业论文外文文献译文
  14. 威沙特分布和逆威沙特分布(Wishart 分布及逆 Wishart 分布)
  15. MIPI DSI 接口协议介绍
  16. 日语动词变形方法全解
  17. 使用微PE工具箱PE装机工具U盘重装系统win11
  18. 建木DevOps流程的快速运用
  19. python五角星教程_绘制五角星_清华尹成python入门教程_少儿编程视频-51CTO学院
  20. SFM 与MVS的区别

热门文章

  1. 闭包、闭包作用及缺点
  2. wx小程序怎么自定义顶部背景色/文字/及文字颜色?
  3. 三星Gear S智能手表自带3G模块 可直接打电话
  4. 用Python轻松爬下智联招聘七千条招聘信息!
  5. eb前端研发工程师编程能力飞升之路
  6. CButton类的Create函数用法
  7. java强制下线 session,登录的多地挤下线功能 redis session
  8. 大学生应该脱口而出的100句
  9. springboot的yml文件没有绿叶
  10. modules.builtin文件作用