Dart中修改Model对象时原对象被篡改?求原因及解决方案
为什么原对象的list会被修改?
Dart里的对象(包括自定义类Model、List这类集合)都是引用类型,赋值操作传递的是对象的内存引用,不是整个对象的拷贝:
- 执行
Model test = item;时,test和item指向内存中同一个Model实例,并没有创建新的Model对象。 - 接着
List modifyList = test.list!;,modifyList同样指向item.list对应的那个List实例,相当于给同一个List起了个别名。 - 所以你修改
modifyList[0] = 999时,本质是修改了这个共享的List对象,不管是item.list还是test.list,它们的引用都指向这个List,自然都会看到修改后的结果。 - 后面的
test = Model(list: modifyList);只是让test指向了一个新的Model实例,但modifyList还是原来的那个List,所以新的test.list依然指向原List,最终两个输出都是修改后的值。
如何仅修改test对象而保留原对象?
要实现只修改test的list且不影响原对象,关键是创建List的拷贝,切断和原List的引用关联。可以用List.from()、toList()或者扩展运算符[...]生成新的List实例:
修改后的代码示例
void main() { Model item = Model(list: [3,4]); print(item.list); // 基于原List创建新实例,生成独立的test对象 Model test = Model(list: List.from(item.list!)); // 也可以用扩展运算符:Model test = Model(list: [...item.list!]); List modifyList = test.list!; modifyList[0] = 999; // 这一步可省略,因为modifyList已经是test.list的引用,修改后直接生效 // test = Model(list: modifyList); print("original: " + item.list.toString()); print("modified: " + test.list.toString()); } class Model { String? title; String? postid; List? list; Model({ this.title, this.postid, this.list, }); }
运行输出
[3, 4] original: [3, 4] modified: [999, 4]
如果Model类有更多属性,建议给Model添加拷贝构造方法,方便创建完整的对象拷贝:
class Model { String? title; String? postid; List? list; Model({ this.title, this.postid, this.list, }); // 拷贝构造方法,深度拷贝List Model.copy(Model other) : title = other.title, postid = other.postid, list = other.list != null ? List.from(other.list!) : null; }
使用时直接调用拷贝构造:
Model test = Model.copy(item);
这样不管Model有多少属性,都能快速创建独立的拷贝,修改test的任何属性都不会影响原item。
内容的提问来源于stack exchange,提问作者desmeit
相关产品推荐
相关产品推荐

