目录

一、状态管理简介

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. bootstrap的日期选择器 完整源码demo附效果图
  2. UIBezierPath画圆弧的记录
  3. 20145226《信息安全系统设计基础》第1周学习总结
  4. 【pyqt5】配置Qt Designer之【designer.exe的保存位置及ui文件转py文件及no Qt platform plugin could be initialized 问题解决】
  5. 操作系统概述 记录操作系统相关知识
  6. #define typedef 区别
  7. xml文件中若没有子节点,则删除文件
  8. 配置Mac自带的Apache http服务器
  9. JS 新浪API获取IP归属地
  10. Java map转JSON
  11. NSGA2算法代码理解
  12. 安卓系统命令 ftp服务器,安卓手机 ftp服务器
  13. mybatis插入大于号小于号到oracle
  14. 怎么设置邮箱自动回复?如何设置自动回复功能?
  15. 计算机word中的行间距在哪里设置,word怎么把所有行间距设置成22磅
  16. 中国石油大学《红楼梦研究》在线考试
  17. 《JOEL说软件》-- Jole Spolsky
  18. 使用xamarin开发Android、iOS报错failed to open directory: 系统找不到指定的文件
  19. 在线教育平台的数据分析——用户的地域分布
  20. Elasticsearch学习(四) - 查询①

热门文章

  1. 酒店价格【实际考试的trick】
  2. Apache Maven项目提供的EAR插件详解
  3. 一个时代结束,马云套现1000亿,刘强东套现66亿,安排着外国生活
  4. diea设置代码编辑区背景色为豆沙绿
  5. springboot初体验以及解决遇到的问题
  6. MB1C 501无订单收货报错解决
  7. 学生选修课管理系统c语言,学生选修课管理系统设计C语言版.docx
  8. 大器晚成我服刘邦,48岁才开始创业
  9. 2009年春晚中的IT现象
  10. java factorial函数_java 编程:用迭代法实现阶乘(Factorial):n!=n*(n