지연 import의 확장

지연 import의 확장

지연 로딩되는 라이브러리에서 확장(extension)을 가져올 때 analyzer가 경고를 보내는 경우가 있어요. 지연 import가 확장과는 어울리지 않는 이유를 살펴볼게요.

출처: deferred_import_of_extension

본문

지연 import를 사용해 가져온 라이브러리가, 가져오는 쪽 라이브러리에서 보이는 확장(extension)을 선언하고 있으면 analyzer가 이 진단을 만들어 내요.

확장 메서드는 컴파일 타임에 결정되기 때문이에요. 그런데 지연된 라이브러리의 확장은 컴파일 타임에는 사용할 수 없죠.

더 자세한 내용은 Lazily loading a library 문서를 확인해 보세요.

예시

이름 있는 확장을 정의한 파일 a.dart가 있다고 해 볼게요.

class C {}

extension E on String {
  int get size => length;
}

다음 코드는 이 이름 있는 확장이 라이브러리에 보이기 때문에 이 진단을 만들어 내요.

import 'a.dart' deferred as a;

void f() {
  a.C();
}

흔한 해결책

라이브러리를 지연 import로 가져와야 한다면, 두 가지 방법 중 하나를 쓰면 돼요. 참조하는 이름들만 적어 주는 show 절을 추가하거나, 이름 있는 확장을 전부 적어 주는 hide 절을 추가하는 거죠.

show 절을 추가하면 이런 모습이 돼요.

import 'a.dart' deferred as a show C;

void f() {
  a.C();
}

hide 절을 추가하면 이런 모습이 돼요.

import 'a.dart' deferred as a hide E;

void f() {
  a.C();
}

첫 번째 해결책의 장점도 있어요. 나중에 가져온 라이브러리에 새 확장이 추가되어도 그 확장 때문에 이 진단이 새로 생기지 않는다는 점이죠.

만약 라이브러리를 지연 import로 가져올 필요가 없거나, 그 안에 선언된 확장 메서드를 꼭 써야 한다면 deferred 키워드를 지우면 돼요.

import 'a.dart' as a;

void f() {
  a.C();
}

더 알아보기