介绍flutter中的状态管理
官方文档指路
当我们在进行app开发时,会需要app的不同界面共享应用程序的某些状态。如何使不同的页面间进行数据的共享,以及处理相关数据导致页面重绘的问题是本文主要讨论的地方。
声明式UI
flutter应用是声明式的,也就是说,状态的改变会导致UI的重新渲染,在声明式的编程中,需要注意的是,一旦给定了一个状态,也就是给定了相对应界面的UI,不能改变
状态分类
这里主要介绍的是需要开发者进行管理的状态类型
-
短时状态(ephemeral)
短时状态 (有时也称 用户界面(UI)状态 或者 局部状态) ,可以类比为 React中每个组件本身管理的state,这部分数据在其他的widget树中不需要去访问,这种状态使用StatefulWidget
管理即可。 -
应用状态(app state)
在应用的多个部分都需要使用到的非短时状态,且在用户会话期间会一直保留该状态(也称共享状态) -
应用状态的一些例子:
用户选项 登录信息 一个电商应用中的购物车 一个新闻应用中的文章已读/未读状态
-
状态管理方法
Provider
Provider是官方比较推荐的状态管理方式,类似于观察者模式状态改变时要notifyListeners()
.
Provider 实现内部还是利用了InheritedWidget
,并且在dispose之后会被自动调用,支持MultiProvider
- ChangeNotifierProvider
ChangeNotifierProvider widget 可以向其子孙节点暴露一个 ChangeNotifier 实例。它属于 provider package。
- ChangeNotifier
ChangeNotifier 是 Flutter SDK 中的一个简单的类。它用于向监听器发送通知。换言之,如果被定义为
ChangeNotifier,你可以订阅它的状态变化。
- Consumer
Consumer widget 唯一必须的参数就是 builder。当 ChangeNotifier 发生 变化的时候会调用
builder 这个函数。(换言之,当你在模型中调用 notifyListeners() 时,所有和 Consumer 相关的
builder 方法都会被调用。)builder 在被调用的时候会用到三个参数。第一个是 context。在每个 build 方法中都能找到这个参数。
builder 函数的第二个参数是 ChangeNotifier 的实例。它是我们最开始就能得到的实例。你可以通过该实例定义 UI
的内容。第三个参数是 child,用于优化目的。如果 Consumer 下面有一个庞大的子树,当模型发生改变的时候,该子树 并不会
改变,那么你就可以仅仅创建它一次,然后通过 builder 获得该实例。
一个简单的利用provider实现的counter