Weitere ähnliche Inhalte
Ähnlich wie Dart / Flutter コードファイルジェネレート入門 (20)
Dart / Flutter コードファイルジェネレート入門
- 3. はじめに
flutter 公式サイトでは、
Simple app state management ページを設けて、
provider パッケージを使った実装が紹介されていますが
昨今の Flutter 開発でのアーキテクチャは、
MVVM + Repository に落ち着いてきているようです。
3
【参照】 Flutter はプロダクション開発に耐えうるのか
https://speakerdeck.com/wasabeef/flutter-ready-for-production
- 4. 昨今の Flutter 開発でのアーキテクチャ
MVVM + Repository パターンの
DI / Service Locator と State management のために、
StateNotifier + Reverpod パッケージが基本のようで
4
riverpod 0.12.3
https://pub.dev/packages/riverpod
state_notifier 0.6.0
https://pub.dev/packages/state_notifier
- 12. マルチプロジェクト・リポジトリの作成
マルチプロジェクトの作成に決まったルールはありませんが、
flutter create コマンドを使って入れ子のプロジェクトが作れます。
1. リポジトリ用に、パッケージテンプレートのプロジェクト
①
を作る。
$ flutter crete --template=package xxx_repository
2. ①のディレクトリ内で、アノテーション
②
とジェネレータ③
用に
パッケージテンプレート、example 用にアプリのプロジェクト④
を作成する。
$ flutter crete --template=package xxx_annotations
$ flutter crete --template=package xxx_generator
$ flutter crete example
3. 前頁を参考に①②③④から不要なファイルやディレクトリを削除する。
flutter create コマンドは、IntelliJ や VSCODE などの IDE 設定ファイルや
.gitignore ファイルのテンプレートも作ってくれます。
12
- 13. マルチプロジェクトの初期設定
● アノテーション用プロジェクト
pubspec.yaml 設定は、 dependencies: dev_dependencies: 特になし。
● ジェネレータ用プロジェクト
dependencies: に analyzer, build, build_config, source_gen を追加、
さらにアノテーション用パッケージ (プロジェクトへの相対パス指定可 ) を追加。
dev_dependencies: に build_runner, test を追加。
プロジェクトルートに build.yaml を新規追加 (空実装で可) 。
● example用プロジェクト
dependencies: に アノテーション用パッケージを追加 (上記備考参照)、
dev_dependencies: に build_runner, test を追加、
さらにジェネレータ用パッケージ (プロジェクトへの相対パス指定可 ) を追加。
13
- 15. アノテーション作成
Flutter / Dart では、
const 生成可能な 値 (value) をもつクラスをアノテーションとして利用できます。
クラスに情報を付加する ClassInfo アノテーションと、
クラスフィールドに情報を付加する FieldInfo アノテーションを
サンプルとして作ってみました。
アノテーションのパッケージ (プロジェクト) をインポートした
ジェネレータや example プロジェクトのコード中では、
のように使えます。
15
- 23. オリジナルクラスのコード解析と サポートクラスのコード生成
アノテーション付加クラスのコード解析&出力
23
source_gen package > documentation > source_gen > GeneratorForAnnotation<T>
https://pub.dev/documentation/source_gen/latest/source_gen/GeneratorForAnnotation-class.html
generateForAnnotatdeElement の引数
・element:アノテーションが付加
されたコードの構文要素
・annotation:アノテーション情報
(ここから設定値を取り出します )
・buildStep:ビルドシステムの
ビルド情報 (コード元やアセットの読込 )
- 30. オリジナルクラスのコード解析と サポートクラスのコード生成
アノテーション付加クラスのコード解析(留意)
generateForAnnotatedElement メソッド を用いて、
アノテーション付加されたクラス内部のコード解析をする手法については、
個人的見解として Visitor パターン を使った構文全走査を採用しました。
(Visitor パターンを使えば、ツリー構造全体を再帰的に全走査することができます
)
構文要素(Element) から、Visitor パターンを使って全走査させるには、
Element#visitChildren(ElementVisitor visitor):void メソッドが利用できます。
30
analyzer package > documentation > element > ElementVisitor<R> abstract class
https://pub.dev/documentation/analyzer/latest/dart_element_element/ElementVisitor-class.html
analyzer package > documentation > element > Element visitChildren abstract method
https://pub.dev/documentation/analyzer/latest/dart_element_element/Element/visitChildren.html
- 38. オリジナルクラスのコード解析と サポートクラスのコード生成
4.ClassInfo と FieldInfo アノテーションの検出+設定値取得
source_gen の TypeChecker を使えば、
アノテーション利用型用のオブジェクトを生成することで、
アノテーションの 検知 と 設定値取得 が可能になります。
● コンストラクタ TypeChecker.fromRuntime(T)
● TypeChecker#hasAnnotationOf(element):bool
Element にアノテーションが付加されているか否かが判別できます。
● TypeChecker#firstAnnotationOf(element)
.getField(フィールド名).toTypeValue():DartType
このメソッドチェーンで アノテーションの設定値 が取得できます。
この例では、アノテーション値が Type として toTypeValue() を使っています。
様々な toXxxValue があるので、アノテーション値が String なら toStringValue() が使えます。
38
source_gen package > documentation > source_gen > TypeChecker abstract class
https://pub.dev/documentation/source_gen/latest/source_gen/TypeChecker-class.html
- 47. 47
〜 省略 〜
〜 省略 〜
出力例
FieldInfo アノテーションも検出され、
設定値が出力されています。
アノテーションのない Product も出力
import もパッケージ付きで出力
【注意】最終章完了段階を経た場合の出力例です。
- 58. ビルダー作成
● は、
引数指定の ジェネレータで、コード解析とコード出力 を行わせます。
XXX.dart ファイルから、引数指定拡張子 のコードファイルを生成します。
(例 拡張子指定 ⇒ )
58
は、 コードファイルから、 を生成します。
ファクトリ関数
source_gen package > documentation > source_gen > LibraryBuilder class
https://github.com/dart-lang/sdk/blob/master/pkg/analyzer/doc/tutorial/tutorial.md
- 59. ビルダー作成 (補足)
パッケージは、
part of ‘オリジナルコードファイル’ の有無と、
共有ファイル作成の有無により、3つのビルダーを提供します。
● 記述を含まないコードファイルを作成 (前述)
● 記述を含むコードファイルを作成
● 記述を含む 指定 と、
記述を含まない コードファイルを作成
59
source_gen package > documentation > source_gen > SharedPartBuilder class
https://pub.dev/documentation/source_gen/latest/source_gen/SharedPartBuilder-class.html
source_gen package > documentation > source_gen > PartBuilder class
https://pub.dev/documentation/source_gen/latest/source_gen/PartBuilder-class.html
- 71. 公式サイトのドキュメント制限
Dart 言語公式サイトに、build_runner のページがありますが
build_runner コマンドと 依存性の設定 (pubspec.yaml) および、
ビルド方法指定 (build.yaml 設定) へのリンク紹介のみです。
コードファイル生成の詳細情報は、見つかりませんでした。
71
Build FAQ
https://dart.dev/tools/build_runnerhttps://github.com/dart-lang/build/blob/master/docs/faq.md
build_runner
https://dart.dev/tools/build_runner
Getting started with build_runner
https://github.com/dart-lang/build/blob/master/docs/getting_started.md
# build_runner を実行するコマンドライン
$ dart pub run build_runner build # Dart SDK
$ flutter pub run build_runner build # Flutter SDK
- 72. コードファイル生成 基本資料(独自調査概要)
● build
コードファイル生成 (ビルド) に関する基盤機能を提供します。
● build_config
ビルダークラスやソース先などの ビルド指定 (build.yaml) を提供します。
● analyzer
ソースコード解析に必要な Class, Field の構文要素(Element) を提供します。
● build_runner
ビルド指定 (build.yaml) をもとにコードファイル生成ビルドを行います。
● source_gen
アノテーション要素やビルダー提供などソース生成とコードファイル生成を補助する
機能を提供します。
72
前ページの build リポジトリ資料から独自展開した、関連公式パッケージ概要