逐步完善…
资料
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得出来的。