地图条目的空感知分配

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 在一行中出现了两次。

您也可以使用 Mapupdate 方法。如果键 '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}
}