likes
comments
collection
share

Flutter 状态管理之 Redux,BLoC,Provider 的流程分析

作者站长头像
站长
· 阅读数 4

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中间件比较适合。

Flutter 状态管理之 Redux,BLoC,Provider 的流程分析

从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

模式分析

Flutter 状态管理之 Redux,BLoC,Provider 的流程分析

BlocBuilder

BlocBuilder是flutter_bloc提供的一个基础组件,用于构建组件并响应组件新的状态,它通常需要Bloc和builder两个参数。BlocBuilder与StreamBuilder的作用一样,但是它简化了StreamBuilder的实现细节,减少一部分必须的模版代码。

Bloc

继承使用,内置一个StreamController类型eventController进行流控制,可以直接调用add函数触发流。

BlocProvider

内部同样使用InheritedWidget实现。

实现流程

  1. 继承Bloc实现核心类BlocVM,负责接受接受数据处理请求和触发流。
  2. 提供provider进行Bloc的初始化
  3. 然后通过构建BlocBuilder来进行UI包装,
  4. 通过BlocBuilder中提供的context (BlocProvider.of(context)) 来获取Bloc
  5. 调用Bloc.add(event)触发流,在mapEventToState函数中,对流事件event进行处理。
  6. 调用yield触发流输出,完成页面页面刷新。

Provider

基于传统的观察者模式,入手简单,和MVVM结合的很好,但是响应流的控制不是很健壮。

关键角色有 Provider,ChangeNotifier,Consumer。

模式分析:

Flutter 状态管理之 Redux,BLoC,Provider 的流程分析

Provider同样需要一个ChangeNotifierProvider来进行构建,不同的是,本来做为child的view,需要封装在一个Consumer,这样看来真正负责刷新构建的正是Consumer,内部,它通过Provider.of(context)获取Provider。

实现流程:

  1. 实现一个继承于ChangeNotifier的核心类,负责接受数据请求和完成通知。
  2. 顶层创建MultiProvider来初始化数据。
  3. 使用ChangeNotifierProvider创建和Consumer包装view,并且传入ChangeNotifier.
  4. view通过操纵ChangeNotifier来进行状态管理。