Flutter 通过观察者模式来实现跨组件状态共享

47 阅读1分钟

状态管理一般的原则是: 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();
}

通过观察者模式来实现跨组件状态共享有一些明显的缺点:

  1. 必须显式定义各种事件,不好管理。
  2. 订阅者必须需显式注册状态改变回调,也必须在组件销毁时手动去解绑回调以避免内存泄露。

在Flutter当中有没有更好的跨组件状态管理方式了呢?答案是肯定的,那怎么做的?接下便详细介绍一下Provider的用法及原理。