Flutter 地图更改而不必更改省道

Flutter 地图更改而不必更改省道,flutter,dart,Flutter,Dart,我有以下代码: Map<String, dynamic> dataUser = { 'name': group.name, 'simplify_group_debts': group.simplifyGroupDebts, 'admin_user': group.adminUser, 'timestamp': ServerValue.timestamp, }; Map<String, dynamic> data = dataUser; print(da

我有以下代码:

Map<String, dynamic> dataUser = {
  'name': group.name,
  'simplify_group_debts': group.simplifyGroupDebts,
  'admin_user': group.adminUser,
  'timestamp': ServerValue.timestamp,
};

Map<String, dynamic> data = dataUser;

print(dataUser);

data.putIfAbsent('members', () => {user.uid: true});

print(dataUser);
映射数据用户={
“名称”:group.name,
“简化组债务”:组。简化组债务,
“管理员用户”:group.adminUser,
“timestamp”:ServerValue.timestamp,
};
地图数据=数据用户;
打印(数据用户);
data.putIfAbsent('members',()=>{user.uid:true});
打印(数据用户);
我只需要在数据地图中添加“成员”。但在使用“putIfAbsent”之后,数据用户也发生了变化

这是输出:


为什么会这样?提前谢谢。

我用USS解决这个问题

final data = Map.from(dataUser);
而不是

Map<String, dynamic> data = dataUser;
Map data=dataUser;

我也不明白为什么。

正如您所示,这是有效的,因为指向此数据结构的指针。如果我们将使用这种语言(不仅是Dart,还可能是Java)
在您的示例中,您为“data”变量指定了指向“dataUser”的指针,而不是该数据的新实例或副本

什么是指针?使用指针,您可以向编译器显示存储数据的内存地址,并给出修改它们的方法

那么,让我们回到您的示例:

Map<String, dynamic> dataUser = {
      'name': group.name,
      'simplify_group_debts': group.simplifyGroupDebts,
      'admin_user': group.adminUser,
      'timestamp': ServerValue.timestamp,
    };

Map<String, dynamic> data = dataUser;

data.putIfAbsent('members', () => {user.uid: true});

它将从“dataUser”映射中创建新的独立实例,并使用其唯一的内存地址指针。因此,当您改变“数据用户”或“数据”映射时,它们不会相互改变,每个映射只会改变自身。

这是正确的工作方式:

data.putIfAbsent('members', () => {user.uid: true});
如果在映射中只需要成员,则将获取新映射()或清除此映射并在该映射中插入成员


请阅读Map()的官方文件。putIfAbsent方法。

数据!=第一个(两个不同的对象)中的数据用户,但第二个(两个相同的对象)中的数据==数据用户。感谢您的解释。非常清楚。
var data = Map.from(dataUser);
data.putIfAbsent('members', () => {user.uid: true});