Flutter页面pop后父页面Map参数被篡改,如何阻止该问题?
问题原理
Dart里的Map是引用类型,而非值类型。你把Page1的a传给Page2时,传递的不是Map的复制版本,而是指向同一个内存实例的引用。所以Page2里对a的修改,本质上是直接改动了Page1中那个Map本身,返回后自然能看到修改后的结果。
解决方法
传递Map副本给Page2
修改Page1的跳转代码,给Page2传原Map的独立副本,这样两边操作的是不同的实例:Map a = {}; Navigator.push(context, MaterialPageRoute(builder: (_) { return Page2(a: Map.from(a)); }));也可以用展开运算符简化写法:
return Page2(a: {...a});在Page2内使用本地副本
要是不想改动Page1的传参逻辑,就在Page2里把收到的Map先复制一份再操作:Map localA = {...a}; localA['test'] = 1; Navigator.pop(context);使用不可变Map(可选)
如果原Map本来就不该被修改,直接定义成不可变的,这样Page2里尝试修改会直接报错,从源头避免问题:final Map a = const {};
内容的提问来源于stack exchange,提问作者Jing
相关产品推荐
相关产品推荐

