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

Flutter中修改复制后的列表元素为何会同步修改原列表?

问题原因

Dart中自定义类的实例属于引用类型,你之前用到的addAll()、List.from()、扩展运算符[...]等方法都仅能实现列表的浅拷贝:仅新生成一个列表容器,容器内存储的仍然是和原列表完全相同的对象引用,指向内存堆区的同一个实例。因此修改新列表中元素的属性时,本质修改的是同一个对象实例的属性,原列表关联的元素自然也会同步变化。

解决方法

需要对列表做深拷贝:复制列表时为每一个元素单独生成全新的实例,将原属性值拷贝到新实例中再存入新列表。Dart生态中通用的实现方式是为自定义类添加copyWith方法:

class Item{
    String description;
    int price; 

    Item(this.description, this.price);

    // 新增copyWith方法,支持按需修改属性后生成新实例
    Item copyWith({
      String? description,
      int? price,
    }) {
      return Item(
        description ?? this.description,
        price ?? this.price,
      );
    }
}

复制列表时遍历原列表的每个元素,调用copyWith生成新实例后存入新列表即可:

List<Item> selectedItems = items.map((item) => item.copyWith()).toList();

修改测试:

selectedItems[0].price = 115;
print(items[0].price); // 输出100,原列表不受影响
print(selectedItems[0].price); // 输出115

如果自定义类存在嵌套的自定义类型属性,需要为嵌套的类也实现copyWith方法,逐层完成深拷贝才能完全避免原列表被修改。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.25 19:45:05