Dart中迭代更新的嵌套Map添加到List如何保留历史值?
问题原因
Dart 中的 Map、List 属于引用类型,变量存储的是数据在内存中的地址,而非数据本身:
- 若直接将同一个
Map实例多次添加到列表,所有列表元素指向同一块内存空间,后续修改原Map时,所有指向该地址的元素都会同步更新。 Map.from()属于浅拷贝,仅复制 Map 的顶层键值对。如果 Map 内部嵌套了子 Map、子 List 等集合类型,嵌套部分仍然会复用原有引用,修改嵌套内容时依旧会出现同步更新的问题。
解决方案
方案1:非嵌套 Map 场景
如果你的 Map 没有嵌套的集合类型,每次添加到列表前用 Map.from 创建顶层副本即可,确保每次加入列表的是独立的 Map 实例:
// 替换原添加逻辑即可 listOfMoves.add(Map.from(dummyMap));
方案2:嵌套 Map 场景
如果 Map 存在嵌套的子集合,需要手动实现深拷贝,复制所有层级的内容:
首先实现深拷贝工具函数:
Map<String, dynamic> deepCopyMap(Map<String, dynamic> origin) { Map<String, dynamic> copy = {}; origin.forEach((key, value) { if (value is Map<String, dynamic>) { copy[key] = deepCopyMap(value); } else if (value is List) { copy[key] = List.from(value); } else { copy[key] = value; } }); return copy; }
使用时替换添加逻辑:
listOfMoves.add(deepCopyMap(dummyMap));
方案3:每次迭代新建 Map 实例
直接在每次循环内部创建全新的 Map 对象,从根源上避免引用复用:
void main() { int count = 0; List<Map<String, dynamic>> listOfMoves = []; for (var i = 0; i < 5; i++) { count++; // 每次迭代重新生成当前状态的Map,不复用外部实例 Map<String, dynamic> currentMap = { '0': { '1': "a", '2': 'b', '3': 'c', }, '1': '$count', '2': '$count', '3': '$count', }; listOfMoves.add(currentMap); print(listOfMoves); } }
内容的提问来源于stack exchange,提问作者Ananth Kumar
相关产品推荐
相关产品推荐

