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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.18 01:03:21