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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.28 07:22:12