deferred 라이브러리의 상수는 case 표현식으로 쓸 수 없어요

deferred 라이브러리의 상수는 case 표현식으로 쓸 수 없어요

Dart 분석기가 case 절에 든 표현식이 deferred import로 가져온 라이브러리의 상수를 참조할 때 이 진단을 내보내요. switch 문을 효율적으로 컴파일하려면 case 절에 참조된 상수가 컴파일 타임에 준비되어 있어야 하는데, deferred 라이브러리의 상수는 컴파일 타임에 사용할 수 없기 때문이에요.

출처: non_constant_case_expression_from_deferred_library

본문

아래처럼 a.dart 파일이 상수 zero를 정의하고 있다고 해볼게요.

const zero = 0;

그런데 a.dartdeferred 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;
  }
}

더 알아보기