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

