空安全和地图

时间:2021-03-12 16:28:33

标签: flutter dart dart-null-safety

您如何处理以下情况:

void main() {
  print(getInt('d'));
}

Map<String, int> myMap = {'a':1, 'b':2, 'c':3};

int getInt(String key) {
  if (!myMap.containsKey(key)) {
    myMap[key] = 0;
  }
  return myMap[key]!; 
}

myMap[key] 永远不会为空,但如果我删除 !return myMap[key]!;,我会收到空​​安全错误:

<块引用>

'int?' 类型的值无法从函数“getInt”返回,因为它的返回类型为“int”。

! 丢弃可空性是否合适,还是有更简洁的方法?

3 个答案:

答案 0 :(得分:2)

不确定更清洁是什么意思,! 确实存在是有原因的。

您可以将 if 语句简化为一行:

int getInt(String key) {
  myMap[key] ??= 0;
  return myMap[key]!; 
}

答案 1 :(得分:0)

当您使用地图时,您无法摆脱爆炸。

这可能是一种更简洁的编码方式。

int getInt(String key) => myMap[key] ?? 0;

答案 2 :(得分:0)

来自docs

<块引用>

如果键不存在,Map 类上的 index [] 运算符将返回 null。这意味着该运算符的返回类型必须可以为空。

Map<String, int> map = {'a': 1};
int i = map['a']; // Error

解决方案:

  • 使用 ?? 并提供默认值。

    int i = map['a'] ?? 0;
    
  • 使用 Bang ! 运算符。

    int i = map['a']!;