跳到主要内容

non_constant_case_expression_from_deferred_library

来自延迟加载库的常量值不能用作 case 表达式。

描述

#

当 case 子句中的表达式引用了通过 deferred 导入方式引入的库中的常量时,分析器会生成此诊断信息。为了高效地编译 switch 语句,case 子句中引用的常量需要在编译时可用,而来自延迟加载库的常量在编译时不可用。

更多信息请参见延迟加载库

示例

#

假设文件 a.dart 定义了常量 zero

dart
const zero = 0;

以下代码会生成此诊断信息,因为库 a.dart 是通过 deferred 导入的,并且在导入库中声明的常量 a.zero 用在了 case 子句中

dart
import 'a.dart' deferred as a;

void f(int x) {
  switch (x) {
    case a.zero:
      // ...
      break;
  }
}

常见修复

#

如果您需要引用导入库中的常量,请移除 deferred 关键字

dart
import 'a.dart' as a;

void f(int x) {
  switch (x) {
    case a.zero:
      // ...
      break;
  }
}

如果您需要引用导入库中的常量,同时又需要导入库是延迟加载的,则将 switch 语句重写为一系列 if 语句

dart
import 'a.dart' deferred as a;

void f(int x) {
  if (x == a.zero) {
    // ...
  }
}

如果您不需要引用该常量,则替换 case 表达式

dart
void f(int x) {
  switch (x) {
    case 0:
      // ...
      break;
  }
}