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

Flutter中使用StateNotifierProvider无法触发Widget重建求助

问题排查:StateNotifierProvider未触发Widget重建

你的代码核心问题是修改了原有列表的内容,而非创建新的列表实例。Riverpod的StateNotifier通过检测状态对象的引用变化来触发更新,当你执行List<bool> newState = state;时,newState只是原有列表的引用,修改它的元素并不会改变列表本身的引用;最后赋值state = newState相当于把同一个对象重新赋值,Riverpod会判定状态未发生变化,因此不会触发Widget的build函数。

修复方案

你需要创建原有状态的副本,修改副本后再赋值给state,让Riverpod检测到引用变化:

方案一:创建列表副本后修改

class SexNotifier extends StateNotifier<List<bool>> {
  SexNotifier() : super([false, false, false]);

  void updateSex(int index) {
    // 创建原有状态的独立副本
    List<bool> newState = List.from(state);
    for (int i = 0; i < newState.length; i++) {
      newState[i] = i == index;
    }
    state = newState;
  }
}

方案二:用map生成新列表(更简洁)

class SexNotifier extends StateNotifier<List<bool>> {
  SexNotifier() : super([false, false, false]);

  void updateSex(int index) {
    // 通过map生成全新的列表实例
    state = state.asMap().entries.map((entry) {
      return entry.key == index;
    }).toList();
  }
}

修改后,每次更新状态都会生成新的List实例,Riverpod能正确检测到状态变化,进而触发SexPicker的build函数,ToggleButtons的选中状态也会正常更新。

内容的提问来源于stack exchange,提问作者zatheg

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.05 06:41:34