Flutter 状态管理
目录
一、状态管理简介
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 状态管理相关推荐
- Flutter 状态管理指南之 Provider
2019 Google I/O 大会,Flutter 团队在"Pragmatic State Management in Flutter "演讲上正式介绍了 Provider.自此 ...
- Flutter 状态管理之Bloc上
前言:Flutter 的状态管理插件有很多,比如 Provider,GetX 还有本篇要讲述的 Bloc .Bloc 目前最新的版本是 flutter_bloc: ^8.0.1. BLoC 依赖 St ...
- flutter 状态管理 flutter_bloc 的使用以及总结
Bloc介绍 flutter_bloc 8.0,直接把mapEventToState方法去掉,需要手动注册事件处理器,不用再写if else 来判断event ,也不用写yield flutter_b ...
- Flutter状态管理1-ChangeNotifierProvider的使用
关于Flutter中的状态管理,可以参考官网的介绍:Simple app state management 中文网的介绍:简单的应用状态管理 Flutter 官方的两个sample: provider ...
- FlyAI小课堂:Flutter 状态管理之BLoC
在正式介绍 BLoC之前, 为什么我们需要状态管理.如果你已经对此十分清楚,那么建议直接跳过这一节. 如果我们的应用足够简单,Flutter 作为一个声明式框架,你或许只需要将 数据 映射成 视图 就 ...
- 【flutter-mobx】Flutter 状态管理- 使用 MobX实现计数器
实践flutter mobx: 提示:对下面这篇掘金文章的实践,通过flutter结合 mobx 实现计数器,过程中也添加了一些处理和注释,代码放在feat/mobx下 https://juejin. ...
- Flutter 状态管理之Bloc下
这篇是使用 Bloc 来实现业务逻辑与UI分离.主要就是慕课网课程列表的网络请求并且展示. 首先定义一个基础事件的类,如下: abstract class LessonEvent {} 然后我定义了3 ...
- flutter 局部状态和全局状态区别_Flutter状态管理
Flutter状态管理 状态管理是声明式编程非常重要的一个概念,我们在前面介绍过Flutter是声明式编程的,也区分声明式编程和命令式编程的区别. 这里,我们就来系统的学习一下Flutter声明式编程 ...
- Flutter 超简单状态管理
Flutter 状态管理 目前Flutter已经有许多状态管理的方案,但就我个人而言,并不能完全满足我的要求.我希望状态管理更加简单,而不是成为负担,我希望状态管理更加可靠,而不是使用过于复杂的实现. ...
最新文章
- oracle实例由,Oracle数据库和实例
- ReactNative生成android平台的bundle文件命令
- 基于oracle 的PL/SQL编程 -变量使用
- Spring Boot与数据访问
- C语言实现的一个简单的HTTP程序
- [学习笔记]批次需求计划系统-简要
- Stooge排序与Bogo排序算法
- python将字符串拆分成单词_将字符串拆分为单词和标点符号
- 小程序的出现留给APP的时间还会久吗?
- (转载)操作系统还有未来么?
- npoi 未将对象引用设置到对象的实例_new一个对象到底占了多少内存?
- android下在屏幕适配小总结
- java excel 转 图片_有什么方法可以用java 将word或者Excel文件转换成图片文件?
- 杭州SEO:独家揭秘网站首页排版布局的详细方法!
- 【论文笔记】A survey on security and privacy of federated learning(综述)
- inline-block元素高度为0,父级仍被撑起,问题元凶—strut
- WINCE6.0下载地址
- 光学基础知识:焦点、弥散圆、景深、焦深
- Python爬虫进阶——urllib模块使用案例【淘宝】
- python类中的__dict__
热门文章
- 【AGC053D】Everyone is a winner(贪心)(凸包)
- 家庭宽带在有ipv6公网环境下,配置本地tomcat服务器+域名+ssl+ddns,实现ipv6建站、搭建简易的文件服务器、搭建webdav服务器等功能
- PHP中16进制和8进制
- 18张图带你详解IP路由表七大要素:路由前缀、协议类型、优先级等
- matlab 出现错误 an error related to a lxe_win64 or .enc file? enc not exist log Missing Entry: lxe_comm
- YCbCr444转YCbCr422
- 关于Flink中time与watermark的理解
- SpringBoot2.1.4整合log4j2保存日志到MySQL中
- 图像噪声种类--高斯噪声 椒盐噪声
- 奇舞周刊第 412 期:从硬件、渲染、计算三大视角解析渲染性能优化的本质