如下一段Selector的代码
Selector<SearchPageProvider, Tuple2<SearchPageType, List>>(
selector: (_, v) => Tuple2(v.type, v.listSource),
shouldRebuild: (_old, _new) => _old.item1 != _new.item1 || !_old.item2.allElementsSame(_new.item2),
builder: (ctx, tuple, child) {
final type = tuple.item1;
final datas = tuple.item2;
return ListView.builder(
padding: EdgeInsets.only(top: 16),
itemBuilder: (ctx1, idx) {
final entity = datas[idx];
switch (type) {
case SearchPageType.wo:
return GestureDetector(
onTap: () => Navigator.push(
context,
MaterialPageRoute(
builder: (ctx) => WODetailPage(
woID: entity.woId,
woNum: entity.woNum,
isRecurrent: entity.recurrent,
))),
child: WOItemWidget(entity));
case SearchPageType.asset:
return Padding(padding: EdgeInsets.only(left: 16,right: 16, ),child: ReportAssetItemWidget(entity),);
default:
return Container();
}
},
itemCount: datas.length,
);
},
)
在listSource更新之后,会出现如下old 和 new 都是一样,从而导致控件不会rebuild
点击查看Selector的源代码后发现,新旧两个值其实都是指向了同一个数组,在shouldRebuild调用时,总是会返回一个false
所以在selector需要对数组做一下处理,保证让他每次保存的都是一个新的内存地址的数组