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

Flutter Riverpod状态异常变更:子Provider修改父Provider值

问题解决:Riverpod中StateProvider修改导致依赖Provider值变更

你遇到的问题本质是Dart中List的引用类型特性导致的:
在listWithGlobalIDProvider里,final List<String> list = brackets;这行代码并没有创建新的列表,只是把currentListProvider返回的列表的引用赋值给了list变量。所以当你调用list.add()时,实际上修改的是currentListProvider持有的原列表,自然会导致第一个Provider的值被改变。

修复方案

创建原列表的副本,让第二个Provider操作独立的列表实例,而不是共享引用。可以用List.from()或者toList()方法实现:

final listWithGlobalIDProvider =
    StateProvider.autoDispose<BracketList>((ref) {
  final brackets = ref.watch(currentListProvider);
  // 创建原列表的副本,而非直接引用
  final List<String> list = List.from(brackets);
  // 或者使用 brackets.toList() 实现相同效果
  list.add(GlobalBracketID.globalBrackerID);
  ref.keepAlive();
  return list;
});

补充说明

如果你的BracketList是包含自定义对象的列表,浅拷贝(如上述方法)可能不够,需要实现深拷贝来确保对象实例也完全独立。但当前场景是String列表,浅拷贝就足以实现两个列表的独立。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.29 19:23:12