Dart(Flutter)筛选生成的对象列表修改元素同步影响原列表问题
现象成因
Dart中自定义类的实例属于引用类型,列表存储的元素本质是指向堆内存中对象实体的内存地址,而非对象本身的独立拷贝。
你遍历L1将符合条件的对象添加到L2的过程中,仅复制了对象的内存地址引用,堆内存中始终只有一份对应的Cartoon对象实体。因此无论通过L1还是L2中的引用修改对象属性,本质都是修改同一个内存地址上的对象数据,两边自然会同步变更。
独立修改的实现方案
如果需要L1和L2的对象修改互不干扰,需要对存入L2的Cartoon对象做深拷贝:
- 第一步:在Cartoon类中实现
copyWith深拷贝方法,示例如下:
class Cartoon { // 示例类属性,可替换为你实际的属性定义 String title; int releaseYear; Cartoon({required this.title, required this.releaseYear}); // 深拷贝方法 Cartoon copyWith({ String? title, int? releaseYear, // 你定义的所有类属性都需要在此处声明 }) { return Cartoon( title: title ?? this.title, releaseYear: releaseYear ?? this.releaseYear, // 所有属性都按照该规则赋值 ); } }
- 第二步:往L2添加元素时,添加拷贝生成的新对象,而非原对象:
// 原添加逻辑(引用传递) // L2.add(_thisObject); // 修改后添加逻辑(深拷贝,生成独立对象) if(_thisObject.xxx == yyyy) { L2.add(_thisObject.copyWith()); }
注意:如果你的Cartoon类中包含其他自定义类类型的属性,对应自定义类也需要实现
copyWith方法,才能完成完整深拷贝,否则嵌套的自定义类属性仍为引用传递,修改时还会同步变更。
内容的提问来源于stack exchange,提问作者Paul de Pontoise
相关产品推荐
相关产品推荐

