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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.25 23:24:04