invalid_visible_outside_template_annotation — visibleOutsideTemplate 어노테이션의 잘못된 사용

invalid_visible_outside_template_annotation — visibleOutsideTemplate 어노테이션의 잘못된 사용

@visibleOutsideTemplate 어노테이션이 잘못된 곳에 사용될 때 나타나는 진단이에요. 이 어노테이션은 @visibleForTemplate가 붙은 클래스·enum·mixin의 멤버에만 의미가 있어요. 올바른 사용법을 살펴볼게요.

출처: invalid_visible_outside_template_annotation

본문

분석기는 @visibleOutsideTemplate 어노테이션이 잘못 사용될 때 이 진단을 내보내요. 이 어노테이션은 @visibleForTemplate 어노테이션이 달린 클래스·enum·mixin의 멤버에만 붙일 수 있어요. 그렇게 하면 그 멤버들을 @visibleForTemplate이 부과하는 가시성 제한에서 제외(opt out)시키는 역할을 해요.

바꿔 말하면, "이 멤버만은 템플릿 밖에서도 참조할 수 있게 해줘"라는 의미예요.

예시

아래 코드는 클래스 레벨에 @visibleForTemplate이 없는데도 멤버에 @visibleOutsideTemplate을 붙여서 진단이 나타나요.

import 'package:angular_meta/angular_meta.dart';

class C {
  @visibleOutsideTemplate
  int m() {
    return 1;
  }
}

아래 코드는 어노테이션이 클래스·enum·mixin의 멤버가 아니라 클래스 선언 자체에 붙어서 진단이 나타나요.

import 'package:angular_meta/angular_meta.dart';

@visibleOutsideTemplate
class C {}

흔한 해결 방법

만약 클래스가 템플릿이 참조할 수 있도록만 공개된 거라면, 클래스에 @visibleForTemplate 어노테이션을 추가해 주면 돼요.

import 'package:angular_meta/angular_meta.dart';

@visibleForTemplate
class C {
  @visibleOutsideTemplate
  int m() {
    return 1;
  }
}

이제 클래스 전체는 템플릿에서만 보이고, 그중에서 m 멤버만 템플릿 밖에서도 참조할 수 있게 되는 거예요.

반대로, @visibleOutsideTemplate 어노테이션이 @visibleForTemplate가 달린 클래스·enum·mixin의 멤버가 아닌 다른 곳에 붙어 있다면, 어노테이션을 제거하면 돼요.

class C {}

더 알아보기

  • visibleForTemplate·visibleOutsideTemplate 어노테이션은 Angular 기반 템플릿 가시성을 다루는 데 쓰여요. 자세한 내용은 package:angular_meta 패키지 문서를 참고하세요.
  • 가시성 어노테이션 일반(visibleForTesting, visibleForOverriding 등)은 package:meta 문서에서 한 번에 살펴보면 좋아요.