SDリーダー 2in1 i-Phone/Type-c TF SD microSD 変換アダプタ 最大1TB対応 Micro SD/SDカード両対応 写真/ビデオ USB3.0 双方向 高速伝送 SD アダプタ メモリカードリーダー TF SDカード 変換アダプタ 0TG機能 設定不要 i-phone/i-pad/IOS/Windows/Android最新IOS18
¥972 (2025年5月6日 13:15 GMT +09:00 時点 - 詳細はこちら価格および発送可能時期は表示された日付/時刻の時点のものであり、変更される場合があります。本商品の購入においては、購入の時点で当該の Amazon サイトに表示されている価格および発送可能時期の情報が適用されます。)
こんにちは!
株式会社アンドエーアイの荻野と申します!
今回は「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
用途:
戻り値を無視してはいけないことを示します。
結果を使用しなかった場合に警告が表示されます。
例:
f() => 0;
f();
int
@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、ネイティブ開発などの知識を持つ方も歓迎します。最新技術を追い、チームに積極的に貢献できる方をお待ちしています!
採用ページ
エンジニア採用ページ
参考資料
Views: 0