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

