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
相关产品推荐
相关产品推荐

