用户可以保存自己的姓名和照片。用户可以跳过上传个人资料照片。因此,我已经将用户的数据存储在我的数据库中。所以,我不想在photo.url
中设置null。如何为此创建地图?
Future<void> updateUser({String name, String uid, String url}) {
Map<String, dynamic> _map = <String, dynamic>{
'info': {
'name': name
},
};
if (url != null) {
// if user upload profile photo I want to add url to inside `info.photo`
// got an error when try like this
// _map['info']['photo'] = {'url': url};
// this way is replace info, it's mean 'name' key is removed
// _map['info'] = {
// 'photo': {'url': url}
// };
}
return _db.collection('users').doc(uid).set(_map, SetOptions(merge: true));
最终的地图应该是这样的,
{
'info':{
'name':name,
'photo':{ // if url is not null
'url':url
}
}
}
你可以试试这个:
Map<String, dynamic> child = <String, dynamic>{'name': 'name'};
Map<String, dynamic> _map = <String, dynamic>{"info": child};
Map<String, dynamic> info = _map["info"];
info.update(
'photo',
(value) => null,
ifAbsent: () => {'url': 'new url'},
);
_map.update('info', (value) => info);
print(_map);
我使用了一个子映射来强制执行类型转换。
使用if
可以轻松完成
Map<String, dynamic> _map = <String, dynamic>{
'info': {
'name': name,
if (url != null) 'photo' : {'url': url}
},
};