如何在Dart中实现List<List<Map>>的完全独立深拷贝?
问题原因排查与解决方案
原有写法失效的根本原因
- 第一种
dataFTY.map((element)=>element).toList()和第三种List.from(dataFTY)都属于浅拷贝:仅复制了最外层的列表容器,内层的子列表、Map对象仍然和原dataFTY共用同一个内存引用,修改内层元素自然会同步到原对象。 - 第二种
json.decode(json.encode(dataFTY))理论上可以实现深拷贝,失效通常是两种原因:- 你的Map中包含无法被JSON序列化的自定义类型字段,序列化阶段被自动丢弃,导致拷贝结果不符合预期
- 代码执行顺序错误,拷贝操作在原对象修改之后执行,或者拷贝完成后不小心把
dataFTY2重新赋值为原对象的引用
正确深拷贝实现
针对List<List<Map>>类型,你写的拷贝逻辑本身是正确的,也可以直接用下面的通用可复用函数:
List<List<Map>> deepCopyListListMap(List<List<Map>> source) { return source.map((innerList) { return innerList.map((mapItem) => Map.from(mapItem)).toList(); }).toList(); } // 调用方式 var dataFTY2 = deepCopyListListMap(dataFTY);
如果该写法仍然出现同步修改问题,请排查两点:
- 拷贝操作是否在原对象
dataFTY被修改之前执行 - 拷贝完成后是否有其他代码覆盖了
dataFTY2的赋值(比如你代码中注释掉的dataFTY2 = MyGlobals().getFTYFailureMoreDetails()如果放开,会直接覆盖深拷贝结果,变成全局对象的引用)
额外代码隐患提醒
你代码中List failuresOnly = List.filled(trackIDs.length, {}, growable: true;存在逻辑漏洞:List.filled生成的列表所有元素会共用同一个初始Map引用,修改其中任意一个位置的Map属性,所有位置都会同步变化,建议替换为:
List failuresOnly = List.generate(trackIDs.length, (index) => {}, growable: true);
List.generate会为每个位置生成独立的空Map,避免引用共用问题。
内容的提问来源于stack exchange,提问作者Jesse
相关产品推荐
相关产品推荐

