Flutter 状态管理之 Redux,BLoC,Provider 的流程分析
flutter_redux
作为工具类桥接Redux和Flutter,它提供了StoreProvider,StoreBuilder,StoreConnector等这些组件,使我们在flutter中使用redux变的很简便。
常用的状态管理工具都是基于InheritedWidget,redux也不例外,StoreProvider继承于InheritedWidget并且在内部存储着Store,来进行数据的存储和更新,这样可以通过getElementForInheritedWidgetOfExactType方法来方便获取Provider中的store。
模式分析:
Redux 主要由3部分组成,Store、Action、Reducer。
- Store用于存储和管理state;
- Action Store通过Action入参调用dispatch来进行状态更新请求;
- Reducer和Middleware根据Action产生新的状态,由于redux纯函数的设计理念,reducer中一般不会处理异步事件,middleware中间件比较适合。
从view到data,redux承接了整个控制构成,可以看出store在redux数据处理流程中是最关键的角色,结合源码,可以看出,在调用dispatch后,_changeController将reducer返回的新的state入参,进而向StreamBuilder输出流,StoreStreamListener接收到流之后,刷新页面,完成整个数据刷新过程。
NextDispatcher _createReduceAndNotify(bool distinct) {
return (dynamic action) {
final state = reducer(_state, action);
if (distinct && state == _state) return;
_state = state;
_changeController.add(state);
};
}
BLoC
BLoC 库中有三个主要的小部件:
-
Bloc
-
BlocBuilder
-
BlocProvider
模式分析
BlocBuilder
BlocBuilder是flutter_bloc提供的一个基础组件,用于构建组件并响应组件新的状态,它通常需要Bloc和builder两个参数。BlocBuilder与StreamBuilder的作用一样,但是它简化了StreamBuilder的实现细节,减少一部分必须的模版代码。
Bloc
继承使用,内置一个StreamController类型eventController进行流控制,可以直接调用add函数触发流。
BlocProvider
内部同样使用InheritedWidget实现。
实现流程
- 继承Bloc实现核心类BlocVM,负责接受接受数据处理请求和触发流。
- 提供provider进行Bloc的初始化
- 然后通过构建BlocBuilder来进行UI包装,
- 通过BlocBuilder中提供的context (BlocProvider.of(context)) 来获取Bloc
- 调用Bloc.add(event)触发流,在mapEventToState函数中,对流事件event进行处理。
- 调用yield触发流输出,完成页面页面刷新。
Provider
基于传统的观察者模式,入手简单,和MVVM结合的很好,但是响应流的控制不是很健壮。
关键角色有 Provider,ChangeNotifier,Consumer。
模式分析:
Provider同样需要一个ChangeNotifierProvider来进行构建,不同的是,本来做为child的view,需要封装在一个Consumer,这样看来真正负责刷新构建的正是Consumer,内部,它通过Provider.of(context)获取Provider。
实现流程:
- 实现一个继承于ChangeNotifier的核心类,负责接受数据请求和完成通知。
- 顶层创建MultiProvider来初始化数据。
- 使用ChangeNotifierProvider创建和Consumer包装view,并且传入ChangeNotifier.
- view通过操纵ChangeNotifier来进行状态管理。
转载自:https://juejin.cn/post/6943496248141807653