invalid_use_of_visible_for_overriding_member — 오버라이딩 전용 멤버를 다른 용도로 사용

invalid_use_of_visible_for_overriding_member — 오버라이딩 전용 멤버를 다른 용도로 사용

@visibleForOverriding로 표시된 인스턴스 멤버를, 오버라이딩 목적이 아닌 다른 이유로 선언된 라이브러리 밖에서 참조하면 나타나는 진단이에요. 이 어노테이션의 의미와 올바른 사용 범위를 살펴볼게요.

출처: invalid_use_of_visible_for_overriding_member

본문

분석기는 visibleForOverriding 어노테이션이 달린 인스턴스 멤버를, 선언된 라이브러리 밖에서 그 멤버를 오버라이딩하기 위한 목적이 아닌 다른 이유로 참조할 때 이 진단을 내보내요.

쉽게 말해, 이 멤버는 "서브클래스가 오버라이딩하는 용도로만 공개된" 멤버예요. 그래서 공개돼 있더라도 오버라이딩이 아닌 다른 방식으로 건드리면 안 되는 거죠.

예시

먼저 a.dart 파일에 아래 선언이 있다고 해볼게요.

import 'package:meta/meta.dart';

class A {
  @visibleForOverriding
  void a() {}
}

그런데 아래 코드처럼 메서드 a가 (오버라이딩이 아니라) 그냥 호출되면 진단이 나타나요. a가 public인 이유는 오버라이딩을 허용하기 위해서뿐인데, 호출은 그 목적과 무관하니까요.

import 'a.dart';

class B extends A {
  void b() {
    a();
  }
}

여기서 BA를 상속하지만, b() 안에서 a()오버라이딩하지 않고 호출만 하고 있어요. 그래서 제약에 걸리는 거예요.

흔한 해결 방법

멤버를 잘못 사용한 부분을 제거하면 돼요. 즉, 오버라이딩이 아닌 호출이나 참조를 없애면 이 진단이 사라져요.

더 알아보기