目录

一、状态管理简介

1.1 为什么需要状态管理

1.1.1 Flutter与adr/ios UI框架区别

1.1.2 状态管理框架使用场景

1.2 需要解决的问题

二、状态管理框架现有方案调研

2.1 状态管理框架

2.1.1 官方方案

2.2 市场方案调研

2.2.1 flutter_bloc

2.2.2 flutter_redux

2.2.3 fish_redux

一、状态管理简介

1.1 为什么需要状态管理

1.1.1 Flutter与adr/ios UI框架区别

Flutter应用是 声明式(declarative)的框架,需要通过更新状态(state)来更新view。Android SDK 与 iOS UIKit是命令式(imperative)框架,可以获取view实例来更新view。 Flutter 构建的用户界面就是应用的当前状态。

比如 对于以下View变化的例子,Native可以直接 findViewById 获取到View实例,调用相关方法进行更改。 Flutter要改变 UI,Widget 会在自身上触发重建(在 Flutter 中最常见的方法是在 StatefulWidgets 组件上调用 setState())并构造一个新的 Widget 子树。

// Native命令式的(Imperative style)
b.setColor(red)
b.clearChildren()
ViewC c3 = new ViewC(...)
b.add(c3)// Dart 声明式(Declarative style)
return ViewB(color: red,child: ViewC(...),
)

与Native view/UIView 相比Flutter widget 是不可变的,一旦需要变化则生命周期终止。任何时候 widget 或它们的状态变化时, Flutter 框架都会创建一个新的 widget 树的实例。

1.1.2 状态管理框架使用场景

需要自己管理的状态可以分为两种概念类型:短时 (ephemeral) 状态和应用 (app) 状态。

一个独立 widget 中需要,其他widget 树不需要的状态即为短时状态。可以不用状态管理框架。

如果需要应用中的多个部分之间共享一个非短时的状态,比如登陆信息,即需要状态管理框架。

1.2 需要解决的问题

1、通信:父子通信、兄弟通信

2、数据共享:全局状态共享、模块数据共享

3、解耦:view和logic解耦;view细化(解决setState 刷新粒度过大导致的性能损耗);逻辑分层,职责隔离;

4、单元测试:业务逻辑可测试

二、状态管理框架现有方案调研

2.1 状态管理框架

2.1.1 官方方案

1、InheritedWidget、Notification 、 EventBus

可以实现组件间的单向数据传递。

不适用场景:当需要共享的数据关系较多时,单向数据传递很难保持清晰的数据流动方向和顺序,导致应用内数据传递嵌套和回调混乱。

2、Provider

Provider 是flutter官方提供的状态管理库。基于Provider较容易实现MVVM。

库中的Provider组件基于InheritedWidget 实现,因此它也是一个 Widget。

可以用 Provider 来实现静态的数据读传递,也可以使用 ChangeNotifierProvider 来实现动态的数据读写传递,还可以通过 MultiProvider 来实现多个数据资源的共享。

Provider 可以基于 Consumer 精确地控制 UI 刷新粒度。

Provider使用详解

使用示例:

//声明Provider的提供者
ChangeNotifierProvider<LoginViewModel>.value(notifier: LoginViewModel(),        child:LoginPage(),
)/// login_page.dart
//创建provider对象
var loginVM = Provider.of<LoginViewModel>(context);
//使用onPressed: () { loginVM.login()}var isLoading = loginVM.isLoading;//login_view_model.dartclass LoginViewModel extends ChangeNotifier{bool isLoading = false;login(){isLoading = true;LoginModel.login((LoginResult  result)) {isLoading = false;notifyListeners();}     }}

2.2 市场方案调研

flutter_bloc

flutter_redux

fish_redux

简介

Bloc模式的flutter实现。状态管理框架。

Redux模式的Flutter实现。

状态管理框架。

闲鱼开源方案,基于 Redux 做状态管理的flutter应用框架

优/缺点

与Provider相似,可以使用BlocPrivider 实现MVVM。也可以使用bloc相关方法。

优点:UI代码组件化。

缺点:业务较复杂时,无法做到逻辑代码的分治和复用

优点:相比redux还解决了分治,通信,数据驱动,解耦等等问题。

缺点:概念繁多,接入复杂

适用场景

中复杂度模块

中复杂度模块

中大型的复杂应用

学习成本

使用项目

dy_flutter,gsy

gsy

闲鱼

2.2.1 flutter_bloc

BLoC(Business Logic Component)是一种设计模式,可以使业务逻辑和UI展示更好的区分。

Bloc makes it easy to separate presentation from business logic, making your code fast, easy to test, and reusable.

flutter_bloc是bloc的flutter实现,部分逻辑基于Provider实现。因此可以使用BlocProvider实现MVVM;也可以结合StringBuilder、StreamController/Rxdart实现流式管理;也可以使用state、event 、bloc实现bloc。

详解与示例

2.2.2 flutter_redux

redux模式的flutter实现。

详解与示例

2.2.3 fish_redux

基于redux的项目管理框架。

详解与示例

Flutter 状态管理相关推荐

  1. Flutter 状态管理指南之 Provider

    2019 Google I/O 大会,Flutter 团队在"Pragmatic State Management in Flutter "演讲上正式介绍了 Provider.自此 ...

  2. Flutter 状态管理之Bloc上

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

  3. flutter 状态管理 flutter_bloc 的使用以及总结

    Bloc介绍 flutter_bloc 8.0,直接把mapEventToState方法去掉,需要手动注册事件处理器,不用再写if else 来判断event ,也不用写yield flutter_b ...

  4. Flutter状态管理1-ChangeNotifierProvider的使用

    关于Flutter中的状态管理,可以参考官网的介绍:Simple app state management 中文网的介绍:简单的应用状态管理 Flutter 官方的两个sample: provider ...

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

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

  6. 【flutter-mobx】Flutter 状态管理- 使用 MobX实现计数器

    实践flutter mobx: 提示:对下面这篇掘金文章的实践,通过flutter结合 mobx 实现计数器,过程中也添加了一些处理和注释,代码放在feat/mobx下 https://juejin. ...

  7. Flutter 状态管理之Bloc下

    这篇是使用 Bloc 来实现业务逻辑与UI分离.主要就是慕课网课程列表的网络请求并且展示. 首先定义一个基础事件的类,如下: abstract class LessonEvent {} 然后我定义了3 ...

  8. flutter 局部状态和全局状态区别_Flutter状态管理

    Flutter状态管理 状态管理是声明式编程非常重要的一个概念,我们在前面介绍过Flutter是声明式编程的,也区分声明式编程和命令式编程的区别. 这里,我们就来系统的学习一下Flutter声明式编程 ...

  9. Flutter 超简单状态管理

    Flutter 状态管理 目前Flutter已经有许多状态管理的方案,但就我个人而言,并不能完全满足我的要求.我希望状态管理更加简单,而不是成为负担,我希望状态管理更加可靠,而不是使用过于复杂的实现. ...

最新文章

  1. oracle实例由,Oracle数据库和实例
  2. ReactNative生成android平台的bundle文件命令
  3. 基于oracle 的PL/SQL编程 -变量使用
  4. Spring Boot与数据访问
  5. C语言实现的一个简单的HTTP程序
  6. [学习笔记]批次需求计划系统-简要
  7. Stooge排序与Bogo排序算法
  8. python将字符串拆分成单词_将字符串拆分为单词和标点符号
  9. 小程序的出现留给APP的时间还会久吗?
  10. (转载)操作系统还有未来么?
  11. npoi 未将对象引用设置到对象的实例_new一个对象到底占了多少内存?
  12. android下在屏幕适配小总结
  13. java excel 转 图片_有什么方法可以用java 将word或者Excel文件转换成图片文件?
  14. 杭州SEO:独家揭秘网站首页排版布局的详细方法!
  15. 【论文笔记】A survey on security and privacy of federated learning(综述)
  16. inline-block元素高度为0,父级仍被撑起,问题元凶—strut
  17. WINCE6.0下载地址
  18. 光学基础知识:焦点、弥散圆、景深、焦深
  19. Python爬虫进阶——urllib模块使用案例【淘宝】
  20. python类中的__dict__

热门文章

  1. 【AGC053D】Everyone is a winner(贪心)(凸包)
  2. 家庭宽带在有ipv6公网环境下,配置本地tomcat服务器+域名+ssl+ddns,实现ipv6建站、搭建简易的文件服务器、搭建webdav服务器等功能
  3. PHP中16进制和8进制
  4. 18张图带你详解IP路由表七大要素:路由前缀、协议类型、优先级等
  5. matlab 出现错误 an error related to a lxe_win64 or .enc file? enc not exist log Missing Entry: lxe_comm
  6. YCbCr444转YCbCr422
  7. 关于Flink中time与watermark的理解
  8. SpringBoot2.1.4整合log4j2保存日志到MySQL中
  9. 图像噪声种类--高斯噪声 椒盐噪声
  10. 奇舞周刊第 412 期:从硬件、渲染、计算三大视角解析渲染性能优化的本质