【问题标题】:How to update Map flutter/dart? Does the map updates by reference in flutter or by value?如何更新地图颤振/飞镖?地图是通过颤振中的引用还是按值更新?
【发布时间】:2021-06-07 14:52:53
【问题描述】:

我有一张地图:

{0: {0:"a",1:"b"}}

现在,单击颤动中的按钮时,我想将地图复制到新键。所以应该是

{0: {0:"a",1:"b"},1: {0:"a",1:"b"}}

现在,如果我向键 1 添加一个新值,它也会反映到键 0。

所以不是

{0: {0:"a",1:"b"},1: {0:"a",1:"b",2:"c"}}

变成了

{0: {0:"a",1:"b",2:"c"},1: {0:"a",1:"b",2:"c"}}
 Map<int,dynamic> tempMap=new HashMap();
 tempMap={...pageMap};
 var tempValue=pageMap[pageIndex];
 tempMap[(pageIndex+1)]= tempValue;
 pageMap.clear();
for (var key in tempMap.keys) {
    pageMap.putIfAbsent(key, () => tempMap[key]);
}

地图是否在颤振/飞镖中通过引用复制?

【问题讨论】:

    标签: flutter dart flutter-web


    【解决方案1】:

    一般来说,var x = y 使 x 和 y 都指向 same 对象。如果您现在向 x 发送方法,它也会影响 y,因为它们不是两个不同的对象。因此,向由 y 引用的地图添加一个值也会使同一元素通过 x 可见。

    【讨论】:

    • 如果你想让它们完全不相关,你可以使用深度克隆,它必须逐项构建。
    【解决方案2】:

    在 Dart 中,地图是通过引用而不是值来更新的。但是您可以创建第一个地图的新副本并将该副本分配给第二个地图。这样你就可以修改第二个而不修改第一个。

        final firstMap = {1: 'test'};
        var secondMap = new Map<int,dynamic>.from(firstMap);
        // You can modify secondMap now without firstMap changing
    

    您是否尝试过直接更新第一张地图?这可能是一种更简单的方法

        pageMap.putIfAbsent(pageIndex + 1, () => pageMap[pageIndex]);
    

    【讨论】:

    • 但我的 firstMap 是应该包含所有值的 Map,包括一次更新。不幸的是,所有密钥都在更新。此外,正如您在代码中看到的,我正在对临时地图进行操作并更新主地图
    • 我明白了。在更新的答案中尝试我的建议,看看它是否是您需要的。
    【解决方案3】:

    这个问题可以用这段代码解决:

    void main(List<String> args) {
      Map getClone(Map data) {
        return data.map((k, v) => MapEntry(k, v is Map ? getClone(v) : v));
      }
      
      var map1 = {0: {0:'a',1:'b'}};
      var map2 = <int, dynamic>{};
      map2[0] = getClone(map1);
      map2[1] = getClone(map1);
      print(map2);
      map2[0][0][2] = 'c';
      print(map2);
    }
    

    结果:

    {0: {0: {0: a, 1: b}}, 1: {0: {0: a, 1: b}}}
    {0: {0: {0: a, 1: b, 2: c}}, 1: {0: {0: a, 1: b}}}
    

    【讨论】:

      猜你喜欢
      • 2020-05-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-01-26
      • 1970-01-01
      • 1970-01-01
      • 2021-10-07
      • 1970-01-01
      相关资源
      最近更新 更多