📜  尝试为缺少的常量添加 case 子句,或添加默认子句.dartmissing_enum_constant_in_switch. - 飞镖(1)

📅  最后修改于: 2023-12-03 15:25:23.182000             🧑  作者: Mango

一、问题描述

在使用枚举类型的 switch 语句时,如果枚举类型新增了常量,但是没有在 switch 语句的 case 子句中添加相应的处理,就会出现该警告。警告消息如下:

Missing case clause for the missing enum constant: 'xxxxx'

二、问题示例

例如,定义了一个枚举类型 Color,含有三个常量,用于表示颜色:

enum Color {
  red,
  blue,
  green,
}

在使用 switch 语句对枚举类型进行处理时,如果没有加入新的枚举常量处理的 case 子句,就会出现警告:

void printColor(Color color) {
  switch (color) {
    case Color.red:
      print('red');
      break;
    case Color.blue:
      print('blue');
      break;
    case Color.green:
      print('green');
      break;
  }
}

void main() {
  Color color = Color.blue;
  printColor(color);
  
  color = Color.orange;
  printColor(color);
}

输出警告消息如下:

Warning: This expression has a type of 'Color' which is implicitly non-nullable, but its value can be 'null'.
Missing case clause for the missing enum constant: 'Color.orange'.
Try adding a new case clause for the missing constant, or adding a default clause instead.dart(missing_enum_constant_in_switch)
三、解决方案

解决该问题的方法有两种:

1. 添加新的 case 子句

当枚举类型新增了常量时,可以在 switch 语句中添加相应的处理 case 子句。例如,当新增了一个 Color.orange 常量,可以在 switch 语句中添加如下子句:

void printColor(Color color) {
  switch (color) {
    case Color.red:
      print('red');
      break;
    case Color.blue:
      print('blue');
      break;
    case Color.green:
      print('green');
      break;
    case Color.orange:  // 新增的枚举常量
      print('orange');
      break;
  }
}

void main() {
  Color color = Color.blue;
  printColor(color);
  
  color = Color.orange;
  printColor(color);  // 输出 'orange'
}

输出结果为:

blue
orange
2. 添加默认的 case 子句

如果不想添加新的 case 子句来处理新增的常量,可以在 switch 语句末尾添加默认的 case 子句,用来处理枚举类型中未包含的常量,如下所示:

void printColor(Color color) {
  switch (color) {
    case Color.red:
      print('red');
      break;
    case Color.blue:
      print('blue');
      break;
    case Color.green:
      print('green');
      break;
    default:
      print('unknown');  // 处理未知的枚举常量
  }
}

void main() {
  Color color = Color.blue;
  printColor(color);
  
  color = Color.orange;
  printColor(color);  // 输出 'unknown'
}

输出结果为:

blue
unknown
四、小结

在使用枚举类型的 switch 语句时,如果枚举类型新增了常量,建议在 switch 语句中添加相应的处理 case 子句,或添加默认的 case 子句用于处理未知的枚举常量。这样不仅可以避免警告的出现,也可以确保程序的正确性。