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

Flutter/Dart列表赋值问题:修改赋值后的变量B为何会同步影响初始变量A

问题原因

你使用的toList()、展开运算符、List.from()等方法都仅能实现列表的浅拷贝:仅会创建一个新的列表容器,容器内存储的仍然是原有FilterField对象的引用,并未生成新的FilterField实例。因此你修改任意列表内的FilterField对象属性,另一个列表中指向同一内存地址的对象也会同步变更,这就是问题出现的核心原因。

解决方案
  • 第一步:为FilterField类新增clone深拷贝方法,用于生成完全独立的新实例:
class FilterField {
  // 原有属性定义、构造方法保持不变

  FilterField clone() {
    return FilterField(
      filteredApplied: this.filteredApplied,
      field: this.field,
      label: this.label,
      // 如果filteringOperators是自定义类/集合类型,需要对该属性也做对应深拷贝
      filteringOperators: this.filteringOperators,
      criteria: this.criteria,
      checked: this.checked,
    );
  }
}
  • 第二步:修改resetFieldsToOriginal重置方法,遍历_initFields中所有元素并调用clone方法生成新实例,再赋值给_fields:
void resetFieldsToOriginal() {
  _fields = _initFields?.map((originField) => originField.clone()).toList();
}
可选优化建议

为了避免后续业务代码误修改备份列表_initFields,可以在初始化填充完成后,将_initFields设置为不可修改列表:

// 所有addInitField调用完成后执行
_initFields = List.unmodifiable(_initFields!);

如果后续代码误调用addInitField、修改列表元素等操作会直接抛出异常,方便快速定位误操作问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.01 12:15:04