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

Dart中如何复制Map以避免关联原对象的引用?

问题原因

你当前使用的Map.from属于浅拷贝,仅会复制Map的顶层键值对,若Map存储的value是嵌套Map、List、自定义类实例这类引用类型,拷贝后的两个Map中保存的仍是同一个对象的引用,修改对象内部属性时就会出现同步变动的问题。

解决方案

这里提供两种常用实现方式,可根据实际场景选择:

  • 方案1:手写深拷贝逻辑(性能最优,适合结构固定的场景)
    若你明确知道Map内部的字段结构,手动递归拷贝每个层级的引用类型即可,示例代码如下:

    // 示例:假设UserGroup下包含基础类型和嵌套的permission Map
    Map<String, dynamic> deepCopyUserGroup(Map<String, dynamic> origin) {
      return {
        // 基础类型直接赋值
        'groupId': origin['groupId'],
        'groupName': origin['groupName'],
        // 引用类型单独拷贝,嵌套层级多的话可以继续递归调用拷贝方法
        'permission': Map.from(origin['permission']),
        'memberList': List.from(origin['memberList'])
      };
    }
    
    // 遍历原始Map完成深拷贝
    SavedSettings.UserGroups = config.UserGroups.map(
      (key, value) => MapEntry(key, deepCopyUserGroup(value))
    );
    UnSavedSettings.UserGroups = config.UserGroups.map(
      (key, value) => MapEntry(key, deepCopyUserGroup(value))
    );
    
  • 方案2:序列化反序列化实现深拷贝(写法最简单,适合动态结构场景)
    如果你的Map结构不固定,且内部所有对象都支持JSON序列化,可以直接用JSON序列化再反序列化的方式生成全新的深拷贝对象,代码如下:

    import 'dart:convert';
    
    SavedSettings.UserGroups = jsonDecode(jsonEncode(config.UserGroups));
    UnSavedSettings.UserGroups = jsonDecode(jsonEncode(config.UserGroups));
    

    注意:如果Map中存在自定义的、没有实现toJson方法的类实例,该方法会抛出异常,不适用。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 09:12:04