地图条目的空感知分配
Null aware assignment of map entry
有没有一种优雅的方式来为地图编写以下语句?
String? img = json['image'];
if (img != null) {
json['image'] = 'https://example.com/ingredients_100x100/' + img;
}
基本上我想附加图像 IFF 它存在,如果不存在则忽略。这与 ??= 的效果相反,其中只有当图像被发现为空时才会发生赋值。这类似于 putIfAbsent.
我能想到的最好的是:
String? img = json['image'];
json['image'] = img != null ? 'https://example.com/ingredients_100x100/' + img : null;
我只是觉得这是空安全的错误写法,因为单词 null 在一行中出现了两次。
您也可以使用 Map
的 update
方法。如果键 'image' 不存在,它将抛出错误。
使用 update
方法,如果键 image
不存在,您还可以轻松提供默认值。
const baseImgUrl = 'https://example.com/ingredients_100x100/';
const defaultImgFilename = 'default.png';
Map<String, dynamic> updateImage(Map<String, dynamic> json) {
try {
return json
..update(
'image',
(filename) => '$baseImgUrl$filename',
);
} catch (_) { // key not in map
return json;
}
}
Map<String, dynamic> updateImageWithDefault(Map<String, dynamic> json) {
return json
..update(
'image',
(filename) => '$baseImgUrl$filename',
ifAbsent: () => '$baseImgUrl$defaultImgFilename',
);
}
void main() {
Map<String, dynamic> jsonWithoutImage = {'data': 123};
updateImage(jsonWithoutImage);
print('JSON without image: $jsonWithoutImage');
// JSON without image: {data: 123}
updateImageWithDefault(jsonWithoutImage);
print('JSON with default image: $jsonWithoutImage');
// JSON with default image: {data: 123, image: https://example.com/ingredients_100x100/default.png}
Map<String, dynamic> jsonWithImage = {'data': 123, 'image': 'apple.png'};
updateImage(jsonWithImage);
print('JSON with image: $jsonWithImage');
// JSON with image: {data: 123, image: https://example.com/ingredients_100x100/apple.png}
}
有没有一种优雅的方式来为地图编写以下语句?
String? img = json['image'];
if (img != null) {
json['image'] = 'https://example.com/ingredients_100x100/' + img;
}
基本上我想附加图像 IFF 它存在,如果不存在则忽略。这与 ??= 的效果相反,其中只有当图像被发现为空时才会发生赋值。这类似于 putIfAbsent.
我能想到的最好的是:
String? img = json['image'];
json['image'] = img != null ? 'https://example.com/ingredients_100x100/' + img : null;
我只是觉得这是空安全的错误写法,因为单词 null 在一行中出现了两次。
您也可以使用 Map
的 update
方法。如果键 'image' 不存在,它将抛出错误。
使用 update
方法,如果键 image
不存在,您还可以轻松提供默认值。
const baseImgUrl = 'https://example.com/ingredients_100x100/';
const defaultImgFilename = 'default.png';
Map<String, dynamic> updateImage(Map<String, dynamic> json) {
try {
return json
..update(
'image',
(filename) => '$baseImgUrl$filename',
);
} catch (_) { // key not in map
return json;
}
}
Map<String, dynamic> updateImageWithDefault(Map<String, dynamic> json) {
return json
..update(
'image',
(filename) => '$baseImgUrl$filename',
ifAbsent: () => '$baseImgUrl$defaultImgFilename',
);
}
void main() {
Map<String, dynamic> jsonWithoutImage = {'data': 123};
updateImage(jsonWithoutImage);
print('JSON without image: $jsonWithoutImage');
// JSON without image: {data: 123}
updateImageWithDefault(jsonWithoutImage);
print('JSON with default image: $jsonWithoutImage');
// JSON with default image: {data: 123, image: https://example.com/ingredients_100x100/default.png}
Map<String, dynamic> jsonWithImage = {'data': 123, 'image': 'apple.png'};
updateImage(jsonWithImage);
print('JSON with image: $jsonWithImage');
// JSON with image: {data: 123, image: https://example.com/ingredients_100x100/apple.png}
}