逐步完善…

资料

Flutter学习笔记之Provider 5.0.0入门级使用

Flutter状态管理:Provider4 Selector

Selector

Selector只会更新符合条件的数据。

class Selector<A, S> extends Selector<S> {
  Selector(
    Key key,
    @required ValueWidgetBuilder<S> builder,
    @required S Function(BuildContext, A) selector,
    ShouldRebuild<S> shouldRebuild,
    Widget child,
  ) : assert(selector != null),
        super(
          key: key,
          shouldRebuild: shouldRebuild,
          builder: builder,
          selector: (context) => selector(context, Provider.of(context)),
          child: child
        );
}

先解释一下Selector<A, S>中的范型:

  • A是我们从顶层获取的Provider的类型
  • S是我们关心的具体类型,也就是获取到的Provider中真正对我们有用的类型,需要在selector中返回该类型。这个Selector的刷新范围也从整个Provider变成了S。

快速地看一下Selector中的属性:

  • selector : 就是一个Function,入参将我们获取的provider传入,然后再返回我们所关心的S。
  • shouldRebuild : 这个属性会存储selector过滤后的值,也就是selector返回的S并拿收到通知之后新的S与缓存的S进行比较,从此判断这个Selector是否需要重新构建,默认preview!=next就刷新,如果是collection, selector进行深度比较。
  • builder : 和Consumer一样,这里返回的就是要构建的控件,第二个参数provider,就是我们刚才selector中返回的。
  • child : 这个用于优化一些不用刷新的部分,之前我们说Consumer的时候也有说过。

默认情况下,Selector中的builder是否被调用更新取决于selector中新旧数据比较结果,如果新旧数据是collection,那么这个比较结果是通过collection包中的DeepCollectionEquality得出来的。