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

如何在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);

如果该写法仍然出现同步修改问题,请排查两点:

  1. 拷贝操作是否在原对象dataFTY被修改之前执行
  2. 拷贝完成后是否有其他代码覆盖了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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 22:06:03