将地图添加到列表会将列表中的所有地图更改为最新地图的值

Posted

技术标签:

【中文标题】将地图添加到列表会将列表中的所有地图更改为最新地图的值【英文标题】:Adding map to a list changes all maps in list to the latest map's values 【发布时间】:2021-06-02 21:25:45 【问题描述】:

我正在尝试向我的应用程序添加收藏夹功能,当用户选择项目时,项目详细信息将添加到地图列表中,其中每个地图都有所选项目的详细信息。

我认为这将是一个易于实现的简单系统,但我显然做错了 - 我对飞镖也很陌生 - 抱歉,如果这是一个愚蠢的语法问题。任何帮助将不胜感激,这是我的代码:

class FavoriteServices
  List<Map<String, dynamic>> favoritesList = [];
  Map<String, dynamic> favoriteMap = ;

  void addFavoriteItemNEW(
      String objectID,
      String name,
      String author,
      String publisher,
      String price,
      String condition,
      String image,
  ) 
    favoriteMap["objectID"] = objectID;
    print(favoriteMap);
    favoritesList.add(favoriteMap);
    print(favoritesList);
    

最后添加的地图的值也将是之前所有地图的值。因此,对于列表的长度,这似乎是最新地图的重复。我确信这很愚蠢,但我已经为此苦苦挣扎了一段时间。

提前感谢您的帮助!

【问题讨论】:

【参考方案1】:

TLDR;

favoriteMap 的范围更改为addFavoriteItemNEW 应该可以解决它。


  void addFavoriteItemNEW(
      String objectID,
      String name,
      String author,
      String publisher,
      String price,
      String condition,
      String image,
  ) 
    Map<String, dynamic> favoriteMap = ;
    favoriteMap["objectID"] = objectID;
    print(favoriteMap);
    favoritesList.add(favoriteMap);
    print(favoritesList);
    

但到底发生了什么?

Dart 为Map 使用引用调用

看看这个。

ain() 
  Map a = "test": "test";
  Map b = a;
  a["test"] = "test2";
  print(b); // Prints "test": "test2";

但是我们没有编辑b,所以发生了什么?

无论何时您在某处使用 Map 对象,无论您在何处更改其属性(在同一范围内),它都会在任何使用它的地方得到更新。

您的情况也发生了同样的事情: 因为您不断将favoriteMap(哪个生命周期在类中)添加到列表中,所以只要您更改其任何属性,它就会随着列表中favoriteMap 的每次出现而更改。

【讨论】:

非常感谢!下次我肯定需要考虑我的变量的范围是什么

以上是关于将地图添加到列表会将列表中的所有地图更改为最新地图的值的主要内容,如果未能解决你的问题,请参考以下文章

设置列表或地图中的所有月份以及年份

将地图列表添加到 Firebase 时出错:Flutter

如何将活动 UI 的点击传递到地图片段以将地图更改为 MAP_TYPE_HYBRID

如何将地图列表中的项目显示到列表视图中

我想将 Android Studio 地图中的蓝点更改为箭头

Flutter web:从 Firestore 地图检索的值在添加到列表时被截断