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

