Dart中临时Map调用removeWhere影响原变量的原因及解决方法
Dart临时变量操作修改原Map的原因及解决方案
原因
Dart中Map属于引用类型,当你执行Map<String, dynamic> tempMap = testMap;时,并没有生成新的Map实例,只是给原testMap指向的内存对象新增了一个别名tempMap。两个变量指向完全相同的内存地址,所以通过任意一个变量对Map做修改,都会同步反映到另一个变量上。
解决方案
你提到的扩展操作符写法是最简单的浅拷贝方案:
Map<String, dynamic> tempMap = {...testMap};
...扩展操作符会将原Map的所有键值对拆解后存入新的Map实例,此时tempMap和testMap指向不同的内存地址,后续对tempMap执行removeWhere等修改操作就不会影响原testMap,运行输出会符合预期:
{first: {value: 1}, second: {value: 2}, third: {value: 3}} {first: {value: 1}, second: {value: 2}, third: {value: 3}} {first: {value: 1}}
注意事项
上述方案是浅拷贝,仅会生成新的外层Map实例,如果你的Map存储的值是子Map、List等引用类型,子对象依然是引用传递。如果业务场景需要修改子对象且不影响原变量,需要自行实现深拷贝逻辑,当前仅操作外层键删除的场景下浅拷贝完全适用。
内容的提问来源于stack exchange,提问作者Philipos D.
相关产品推荐
相关产品推荐

