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

Dart循环中向列表添加对象时如何克隆变量避免引用覆盖?

Dart列表添加对象引用导致数据覆盖的解决方法

问题场景

读取XML API的Dart项目中,循环前代码运行正常,但进入循环后出现异常:遍历到第二个board元素时,tmpBoard的内容被新元素数据覆盖,同时tmpKategorie.boards列表中已添加的元素也同步被修改,最终列表所有条目都与最后一个对象内容一致。这是因为列表的add方法添加的是对象的引用,而非对象副本。

原代码

getKategorie(XmlElement element) {
    Kategorie tmpKategorie = Kategorie();
    dynamic iterableElements;
    Board tmpBoard = Board();
    tmpKategorie.id = element.getAttribute("id");
    tmpKategorie.name = element.getElement("name")?.innerText;
    tmpKategorie.description = element.getElement("description")?.innerText;

    iterableElements = element.getElement("boards")?.childElements;
    for (XmlElement tmpElement in iterableElements) {
      if (tmpElement.localName == "board") {
        tmpBoard.id = tmpElement?.getAttribute("id");
        tmpBoard.name = tmpElement?.getElement("name")?.innerText;
        tmpBoard.description = tmpElement?.getElement("description")?.innerText;
        tmpKategorie.boards.add(tmpBoard);
      }
    }
    return tmpKategorie;
  }

使用的自定义类

class Kategorie {
  List<Board> boards = [];
  dynamic id;
  dynamic name = "NN";
  dynamic description = "NN";
}

class Board {
  dynamic id;
  dynamic name;
  dynamic description;
}

解决方案

核心问题是循环外仅创建了一个Board实例,每次循环只是修改该实例的属性,列表中始终存储同一个对象的引用。解决方式是在每次循环内新建Board实例:

修改前代码片段

if (tmpElement.localName == "board") {
        tmpBoard.id = tmpElement?.getAttribute("id");

修改后代码片段

if (tmpElement.localName == "board") {
        tmpBoard = Board();
        tmpBoard.id = tmpElement?.getAttribute("id");

修改后,每次循环都会生成一个独立的Board对象,添加到列表中的是不同对象的引用,后续修改不会影响已存入列表的元素。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.06 05:25:26