정의되지 않은 확장 메서드

정의되지 않은 확장 메서드

Dart 분석기가 내보내는 진단 중 하나인 undefined_extension_method를 살펴볼게요. 확장 오버라이드로 메서드를 호출하거나 정적 메서드를 참조했는데, 지정한 확장에 그 메서드가 정의되어 있지 않을 때 이 진단이 나타나요. 메서드 이름이나 확장 이름 중 어느 쪽이 틀렸는지, 아니면 메서드 자체를 정의해야 하는지에 따라 해결 방법이 달라져요.

출처: undefined_extension_method

본문

이 진단은 다음과 같은 메시지로 나타나요.

  • The method '{0}' isn't defined for the extension '{1}'. (메서드 '{0}'은(는) 확장 '{1}'에 정의되어 있지 않아요.)

설명

분석기는 확장 오버라이드를 사용해 메서드를 호출했는데 그 메서드가 지정한 확장에 정의되어 있지 않을 때 이 진단을 내보내요. 또한 정적 메서드를 참조했는데 지정한 확장에 정의되어 있지 않을 때도 이 진단을 내보내요.

예시

아래 코드는 확장 Eb라는 이름의 인스턴스 메서드가 선언되어 있지 않기 때문에 이 진단이 발생해요.

extension E on String {
  String a() => 'a';
}

extension F on String {
  String b() => 'b';
}

void f() {
  E('c').b();
}

아래 코드는 확장 Ea라는 이름의 정적 메서드가 선언되어 있지 않기 때문에 이 진단이 발생해요.

extension E on String {}

var x = E.a();

자주 쓰는 해결 방법

메서드의 이름이 틀렸다면, 이미 존재하는 메서드의 이름으로 바꿔요.

extension E on String {
  String a() => 'a';
}

extension F on String {
  String b() => 'b';
}

void f() {
  E('c').a();
}

메서드의 이름은 맞는데 확장의 이름이 틀렸다면, 확장의 이름을 올바른 이름으로 바꿔요.

extension E on String {
  String a() => 'a';
}

extension F on String {
  String b() => 'b';
}

void f() {
  F('c').b();
}

메서드와 확장의 이름이 모두 맞는데 메서드가 정의되어 있지 않다면, 메서드를 정의해요.

extension E on String {
  String a() => 'a';
  String b() => 'z';
}

extension F on String {
  String b() => 'b';
}

void f() {
  E('c').b();
}

더 알아보기