Provider提供器

139 阅读2分钟

负责状态数据的维护

五种核心提供器

1.Provider组件:只是向下层节点暴露值,值变化,无法触发通知更新

2.ListenableProvider组件:底层监听值变化,然后依赖的元素触发更新

  • context.watch
  • context.read
  • 不自动处理销毁,需要设置dispose回调
  • 混入Listenable
  • 自己创建管理通知变更final _listeners = [];

3.ChangeNotifierProvider:

  • 是ListenableProvider的子类
  • 管理ChangeNotifier类型的数据
  • 混入(with)ChangeNotifier拥有变化时通知的能力,可以调用notifyListeners
  • 没有dispose回调,提供器销毁时会数据自动销毁
  • 通过BuildContext上下文read和watch数据,不再依赖stf状态类维护状态数据,就可以声明为stl
  • updateShouldNotify控制刷新粒度

继承关系: image.png

4.FutureProvider 异步提供器

  • DeferredInheritedProvider 相关的提供器,deferred 的意思是 延迟的 ,在这里表示异步
  • Flutter两大异步类型,Future和Stream
  • FutureProvider 和 StreamProvider 继承关系:

image.png

FutureProvider<NetState>(
  create: Api.query,
  initialData: NetLoading(),
  catchError: (_, _) => NetFailure('error'),
  child: const FutureProviderTestItem(),
),
  1. StreamProvider 异步流提供器
  • Future对象是一个一次性的异步任务,而Stream可是一个可持续的异步事件
StreamProvider<SignalState>(
  initialData: SignalState(counter: 10, type: SignalType.denial),
  create: (_) => SignalStream().createStream(count: 1000),
  catchError:
      (_, __) => SignalState(counter: -1, type: SignalType.wait),
  child: const StreamProviderTestItem(),
),
    
class SignalStream {
  SignalState _signalState = SignalState(counter: 10, type: SignalType.denial);

  Stream<SignalState> createStream({int count = 100}) async* {
    for (int i = 0; i < count; i++) {
      await Future.delayed(Duration(seconds: 1));
      _signalState = _signalState.next();
      yield _signalState;
    }
  }
}

辅助型提供器

  1. 代理提供器 ProxyProviderX

InheritedProvider 派生中有一类 ProxyProviderX ,其中 X 从 0~6 。字面上来看,是 代理提供器。当一个状态数据模型 A 需要依赖的其他的状态数据模型 B、C、D、E ... 时,就可以使用ProxyProviderX ,其中 X 表示依赖其他模型的数量。

2.ChangeNotifierProxyProvider

InheritedProvider的另一种派生类

3.多个提供器 MultiProvider

并不是 InheritedProvider 的派生类,相当于容纳多个提供器的容器

完整继承关系:

image.png

前面测试中我们都是通过 create 主动创建共享的对象值,如果想要暴露一个已经存在的对象,可以使用 XXXProvider.value 构造。由于值已经存在,所以 .vlaue 构造并不能对值的创建和销毁进行监听回调。