deferred 라이브러리의 상수는 case 표현식으로 쓸 수 없어요
deferred 라이브러리의 상수는 case 표현식으로 쓸 수 없어요
Dart 분석기가 case 절에 든 표현식이 deferred import로 가져온 라이브러리의 상수를 참조할 때 이 진단을 내보내요. switch 문을 효율적으로 컴파일하려면 case 절에 참조된 상수가 컴파일 타임에 준비되어 있어야 하는데, deferred 라이브러리의 상수는 컴파일 타임에 사용할 수 없기 때문이에요.
본문
아래처럼 a.dart 파일이 상수 zero를 정의하고 있다고 해볼게요.
const zero = 0;
그런데 a.dart를 deferred import로 가져온 상태에서 case 절에 a.zero 상수를 사용하면 이 진단이 발생해요.
import 'a.dart' deferred as a;
void f(int x) {
switch (x) {
case a.zero:
// ...
break;
}
}
흔한 해결 방법
가져온 라이브러리의 상수를 참조해야 한다면 deferred 키워드를 빼면 돼요.
import 'a.dart' as a;
void f(int x) {
switch (x) {
case a.zero:
// ...
break;
}
}
가져온 라이브러리의 상수를 참조하면서도 deferred import를 유지해야 한다면, switch 문을 if 문의 나열로 다시 작성하면 돼요.
import 'a.dart' deferred as a;
void f(int x) {
if (x == a.zero) {
// ...
}
}
상수를 따로 참조할 필요가 없다면, case 표현식을 다른 값으로 바꾸면 돼요.
void f(int x) {
switch (x) {
case 0:
// ...
break;
}
}