状态管理一般的原则是: 1、如果状态是组件私有的,则应该由组件自己管理;
2、如果状态要跨组件共享,则该状态应该由各个组件共同的父元素来管理。
3、对于组件私有的状态管理很好理解,但对于跨组件共享的状态,管理的方式就比较多了,如使用全局事件总线EventBus,它是一个观察者模式的实现,通过它就可以实现跨组件状态同步;
4、状态持有方(发布者)负责更新、发布状态,状态使用方(观察者)监听状态改变事件来执行一些操作。
看一个登录状态同步的简单示例:
定义事件:
enum Event{
login,
... //省略其他事件
}
登录页代码大致如下:
// 登录状态改变后发布状态改变事件
bus.emit(Event.login);
依赖登录状态的页面:
void onLoginChanged(e){
//登录状态变化处理逻辑
}
@override
void initState() {
//订阅登录状态改变事件
bus.on(Event.login,onLogin);
super.initState();
}
@override
void dispose() {
//取消订阅
bus.off(Event.login,onLogin);
super.dispose();
}
通过观察者模式来实现跨组件状态共享有一些明显的缺点:
- 必须显式定义各种事件,不好管理。
- 订阅者必须需显式注册状态改变回调,也必须在组件销毁时手动去解绑回调以避免内存泄露。
在Flutter当中有没有更好的跨组件状态管理方式了呢?答案是肯定的,那怎么做的?接下便详细介绍一下Provider的用法及原理。