如何在Provider包中使用带优先级的双重Selector?
解决方案
核心逻辑是仅让boolanalyt1的递增触发组件重建,完全忽略data的变化——除非boolanalyt1更新,否则即使data变动也不重建。
问题大概率出在你获取data的方式:如果是通过context.watch<DataProvider>()这类监听式API获取data,会导致data变化时触发额外重建,打破了Selector的监听规则。
修改后的代码
Selector<DataProvider, int>( selector: (_, p1) => p1.boolanalyt1, builder: (context, value, child) { // 用read获取当前最新data,不会监听data的变化 final data = context.read<DataProvider>().data; final seen = <String>{}; // 临时变量,每次重建时初始化(根据实际需求调整) return ItemFilter( key: UniqueKey(), data: data .where((student) => seen.add(student.analytNiv1)) .toList() .map((e) => Checkbox_Item(item: e.analytNiv1 ?? "VIDE")) .toList(), title: "analyt_niv1", ); }, ),
关键注意事项
- 必须用
context.read<DataProvider>()获取data:read仅获取当前数据,不会建立监听,因此data变化不会触发组件重建; - 禁止在
builder内使用context.watch/Consumer:这类API会额外监听Provider变化,导致data更新时强制重建; - 关于
seen变量:如果它是组件外部的状态,要确保其变化不会触发当前组件的重建;如果是临时去重用的集合,每次重建初始化是合理的。
为什么嵌套Selector无效?
嵌套Selector的思路本身没问题,但如果内层Selector监听了data的变化,依然会在data更新时触发重建。而你的需求是完全忽略data的变化,因此根本不需要监听data,只需要在boolanalyt1触发重建时,读取最新的data即可。
内容的提问来源于stack exchange,提问作者Dev_Kmsiiz
相关产品推荐
相关产品推荐

