You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.09 09:25:25