火曜日, 5月 6, 2025
ホームニューステックニュースdartのmetaライブラリが提供するアノテーション

dartのmetaライブラリが提供するアノテーション


こんにちは!
株式会社アンドエーアイの荻野と申します!
今回は「dartのmetaライブラリが提供するアノテーション」と題して記事を書いていこうと思います!

dartのmetaライブラリはコードに意味づけを行う”アノテーション”を提供します。

”アノテーション”とは「注釈」を意味し、開発者がコードの用途や特性を理解するのに役立つ他、静的解析や開発環境でのオートコンプリートを補助するのに役立ちます。

@doNotStore

対象

ClassType, Constructor, Function, Getter, Library, Method, MixinType

用途:

メソッド・ゲッターに使用することでそれらの返り値をがトップレベル変数に格納されたときに警告を表示します。
また、クラス単位、ライブラリ単位でも使用することができ、そのクラスやライブラリ内のメンバ全てに暗黙的にアノテーションをつけることができます。

例:

String f() => 'Hello world';

final String v = f(); 

String f() => 'Hello world';

final String v = f(); 

@doNotSubmit

対象

Constructor, Function, Getter, Method, OptionalParameter, Setter, TopLevelVariable

用途:

使用されている間は常に警告を表示します。
このアノテーションがついたコードは、開発中やテスト中にのみアクセスされ、本番コードあるいはソース管理リポジトリに含まれるべきでないことを意味します。

例:


void log() => print('Hello world');

void main() {
  log(); 
  runApp(const MyApp());
}

@factory

対象

Method

用途:

対象のメソッドがFactory patternであることを示し、「メソッドが抽象メソッド」または、「返り値がObjectもしくはnullでない」場合に警告を表示します。

とはいえ、 dartにはfactory keywordが用意されているため、あまり使用する機会はないように思います。

例:

class C {
  const C._();

  
  void m() { 
    return;
  }
}

@immutable

対象

ClassType, ExtensionType, MixinType

用途:

対象のクラスがイミュータブルであることを示します。
定数コンストラクタが存在しない場合に警告が表示されます。

例:


class C { 
  C(this.p);
  int? p;
}

class C {
  C(this.p); 
  final int? p;
}

@internal

対象

全ての宣言

用途:

パッケージ内でのみ使用されるべきで、そのパッケージのパブリックAPIから公開されるべきでない宣言であることを示します。
外部パッケージのパッケージからこのアノテーションの付いたAPIを使用した場合に警告が表示されます。

例:

test_package/lib/test_package.dart

library;
import 'package:meta/meta.dart';


class MyInternalClass {}

class MyPublicClass {}

annotation_app/lib/main.dart

import 'package:test_package/test_package.dart';

MyPublicClass myPublicClass = MyPublicClass(); 
MyInternalClass myInternalClass = MyInternalClass(); 

@isTest,@isTestGroup

対象

Function、Method

用途:

@isTest: そのメソッドが単一のテストを実行するためのメソッドであることを示します。
@isTestGroup: そのメソッドが複数のテストを実行するためのメソッドであることを示します。

このアノテーションを付与することでVSCodeなどの開発環境でテスト実行メソッドとして認識されるようになります。

多くの場合はすでにこのアノテーションが使用されているtestWidgetや、groupを使用するため、あまり使用する機会はありません。

例:



@literal

対象

Constructor

用途:

定数コンストラクタであることを明示するために使います。
コンストラクタの呼び出し時に、constを付けなかった場合に警告を表示します。

例:

class C {
  
  const C();
}

final instance = C(); 

@mustBeConst(experimental)

対象

Paramater、ExtensionType

※内部的にエクステンションタイプにも付与できるものの、具体的な実装例は不明。

用途:

パラメータとして渡される値を定数で定義する必要があることを示します。
定数でない値を渡した場合、警告が表示されます。

例:

int f( int p) {
  return p + 1;
}

var v = 1;

final a = f(v); 

@mustBeOverridden

対象

InstanceMember

用途:

サブクラスで必ずオーバーライドすべきメンバーであることを示します。
サブクラスで対象のメンバがオーバーライドされない場合、警告が表示されます。

例:

class A {
  
  void m() {
    return;
  }
}

class B extends A {} 

@mustCallSuper

対象

InstanceMember

用途:

メソッドのオーバーライド時に必ずスーパークラスのメソッドを呼び出さなければならないことを示します。
メンバのオーバーライド時にスーパークラスメソッドを呼び出さない場合、警告が表示されます。

例:

class A {
  
  void m() {}
}

class B extends A {
  
  void m() { 
    
  }
}

@nonVirtual

対象

Method, Getter, Setter, Field

用途:

サブクラスでのオーバーライドを許可しないことを示します。
サブクラスで対象のメソッドやゲッターがオーバーライドされた場合、警告が表示されます。

例:

class A {
  const A();

  
  void m() {}
}

class B extends A {
  const B();

  
  void m() {} 
}

@optionalTypeArgs

対象

ClassType, Extension, ExtensionType, Function, Method, MixinType, TypedefType

用途:

ジェネリクス型を使用する際の型引数を省略可能であることを示します。
ただし、基本的にdartでは型推論によってジェネリクスの型指定を省略できるため、基本的に使う機会はないと思われます。

例:


void fT>() {}

f();

@protected

対象

Method, Getter, Setter, Field

用途:

公式ドキュメントでは以下のように説明されていますが、実際に試してみると別ファイルから対象のメンバを呼び出した際に警告が表示されるような挙動になります。
また、オートコンプリートにも表示されなくなります。

クラスまたはミキシンのインスタンス・メンバをアノテートするために使用します。このインスタンス・メンバは、宣言したライブラリの中だけで、クラスまたはミキシンの他のインスタンス・メンバとそのサブタイプにのみ表示されます。
Used to annotate an instance member in a class or mixin which is meant to be visible only within the declaring library, and to other instance members of the class or mixin, and their subtypes.

例:

my_public_class.dart

class MyPublicClass {
  const MyPublicClass();

  void notProtectedMethod() {}

  
  void protectedMethod() {}
}

main.dart

  final instance = MyPublicClass();

  instance.notProtectedMethod();
  instance.protectedMethod(); 

@redeclare(experimental)

対象

InstanceMember(ExtentionType)

用途:

エクステンションタイプの定義時、スーパークラスのメンバを再定義するメンバであることを示します。
対象のメンバと同名のメンバがスーパークラスで定義されていない場合、警告を表示します。

例:

extension type ExtendedInt(int value) implements int {
  
  bool get isEven => value.isEven; 

  
  bool get isZero => value == 0; 
}

@reopen

対象

ClassType, MixinType

用途:

implicit_reopenのルールが有効になっている場合、interfaceとして定義されたクラスが継承によって意図せずinterfaceでないクラスとして定義(再開)された際に警告が表示されます。
実装者はこのアノテーションを使用し、その実装が意図的であることを示すことができます。

例:

interface class I {}

class C extends I {} 
interface class I {}


class C extends I {}

@required

対象:

Parameter

用途:

パラメータが必須の引数であることを示し、関数使用時に対象のパラメータが含まれない場合警告を表示します。
現在ではrequiredキーワードが存在するため、使用する機会はほとんどなく、
公式ドキュメントでは”将来的に非推奨となる”と記載されています。

非推奨:このアノテーションは、package:meta の将来のリリースでは非推奨となり、削除される予定です。Dart 2.12 以降では、組み込みの required キーワードを使用して、名前付きパラメータを required としてマークします。required の詳細については、名前付きパラメータのドキュメントを参照してください。
Deprecated: This annotation is set to be deprecated and later removed in a future release of package:meta. In Dart 2.12 and later, use the built-in required keyword to mark a named parameter as required. To learn more about required, check out the documentation on named parameters.

例:

void f({ int? p}) {}

f(); 

@sealed

対象

Class

用途:

クラスの継承・実装を同一ライブラリ内のみに制限します。
外部ライブラリから対象のクラス継承・実装した際に警告を表示します。

例:

test_package/lib/test_package.dart


class MySealedClass {}

annotation_app/lib/main.dart

class C extends MySealedClass {} 

@useResult

対象

Constructor, Field, Function, Getter, Method, TopLevelVariable

用途:

戻り値を無視してはいけないことを示します。
結果を使用しなかった場合に警告が表示されます。

例:


int f() => 0;

f(); 

@visibleForOverriding

対象

Method, Getter, Setter, Field

用途:

メソッドが「オーバーライド目的」で公開されていることを示します。
対象となったインスタンスメソッドをスーパークラスで使用した場合警告が表示されます。

例:

test_package/lib/test_package.dart

class MyClass {
  const MyClass();

  
  m() {}
}

class MySubClass extends MyClass {
  const MySubClass();

  
  m() {}
}

annotation_app/lib/main.dart

final instance = MyClass();
final subClassInstance = MySubClass();

instance.m(); 
subClassInstance.m(); 

@visibleForTesting

対象

Constructor, Function, Method, Getter, Setter, Field, Paramater, ClassType, EnumType, MixinType, TypedefType

用途:

テストコードからの利用を目的として公開されていることを示します。
本番コードからの使用に対して警告が表示されます。

例:

test_package/lib/test_package.dart

class MyClass {
  const MyClass();

  
  m() {}
}

annotation_app/lib/main.dart

void main() {
  final instance = MyClass();
  instance.m(); 
}

今回はdartのmetaライブラリのが提供するアノテーションについてまとめました。
アノテーションを使わなくてもコーディングを行うことは可能ですが、
アノテーションを活用することでより安全なコーディングを行うことが可能です。
これらを活用し、より保守性の高い実装を目指しましょう!

PR

アンドエーアイでは事業拡大のため、即戦力エンジニアを募集中!Flutterだけでなく、インフラ、Web、ネイティブ開発などの知識を持つ方も歓迎します。最新技術を追い、チームに積極的に貢献できる方をお待ちしています!

採用ページ

https://iwantyou.andai.net/

エンジニア採用ページ

https://iwantyou.andai.net/engineer

参考資料

https://pub.dev/packages/meta

フラッグシティパートナーズ海外不動産投資セミナー 【DMM FX】入金

Source link

Views: 0

RELATED ARTICLES

返事を書く

あなたのコメントを入力してください。
ここにあなたの名前を入力してください

- Advertisment -

Most Popular