Dart Macros x Firebase

2.5K Views

September 20, 24

スライド概要

YOUTRUST x HOKUTO x ゆめみ Flutter LT会@渋谷 #6 の登壇資料です。

https://yumemi.connpass.com/event/325435/

シェア

またはPlayer版

埋め込む »CMSなどでJSが使えない場合

関連スライド

各ページのテキスト
1.

Dart Macros x Firebase Suguru Kishimoto 2024.09.20 Flutter LT w/YUMEMI, YOUTRUST, HOKUTO

2.

自己紹介 ● ● ● Suguru Kishimoto (@su-, sgr-ksmt) 株式会社HOKUTO CTO 経験 ○ ○ ○ ○ ● エンジニア12年くらい Firebase7年くらい Flutter4年くらい CTO 半年ちょっと 好きなWidgetはCard Widgetです

3.

メディア+ツールが融合した 次世代の情報収集アプリ HOKUTO インプットから臨床現場でのアウトプットまで、 医師の医学情報収集をフルサポート アウトプット ツール機能 ・臨床現場で知りたい情報を素早く確認 インプット メディア機能 ・最新の医学情報をタイムライン形式で入手 ・気になる情報はお気に入りにストック&必要な時 に再活用 3

4.

Dart Macros x Firebase

5.

Dart Macros ● ● 静的メタプログラミングをサポートするための新しい言語機能 build_runnerなどでコード生成するのではなく、コードをコンパイル時に動的に生成 ・修正できる ○ ● 静的解析も有効になるし、 Hot Reloadで素早く適応もできるのが嬉しい まだ開発中のものではあるので、正式版になるのが待ち遠しい ○ 公式からも jsonパッケージが出ているが、これもまだ安定版ではない

6.

話すこと・話さないこと ● 🙆 話すこと ○ ● Firebase Cloud Firestore周りのコードを Dart Macrosを活用して生成してみる 🙅話さないこと ○ ○ ○ Firebase/Flutter周りの基本的な部分など Dart Macrosを使うためのセットアップ Dart Macros周りで出てくる APIの詳細など

7.

Flutter x Firebase

8.

だいたいこんなコードを書く ● モデルの定義 ○ ○ ● freezed, json_serializable使っていることが多い 必要に応じて Timestamp型<>DateTime型の変換をする Converter書いたり コレクション、ドキュメントのパス ○ ○ ○ CollectionReference, DocumentReferenceの定義をどこかしらに書く withConverterで、freezedで生成したモデルの from/toJsonを渡すと、snapshot.data()が指定した 型になるので扱いやすい

9.

だいたいこんなコードを書く

10.

だいたいこんなコードを書く

11.

マクロ使って楽したい 😌

12.

Macro書いてみる

13.

Macro書いてみる

14.

Macro書いてみる

15.

Macroを適用する

16.

生成されたコード

17.

いい感じに生えてきた 🎉

18.

呼び出してみる

19.

良さそう!

20.

(ここからは時間が許せば )

21.

さらなる改良をしたい ... ● ● builderを介して対象のクラスからfield名などが取れるので、where句で指定する部 分をタイプセーフにしたい タイプセーフにするための周辺コードも合わせて自動生成してみたい

22.

完成予想図

23.

完成予想図 (使用感)

24.

コード生成してみる (TBD)

25.

しかし...

26.

うまくいかない ● MemberDeclarationBuilderのdeclareInLibraryでは、`The macro attempted to add declaration(s) not allowed during the declarations phase.`というエラーが出て、classは生成できなさそう ● もしかしたらLibraryDeclarationsMacroを使うといいのかもしれない ○ ○ が、そこまではまだ調査しきれず ... もし解決策わかるよって人がいたらこっそり教えて下さい !

27.

macroを書くときの tips ● ● `macro` キーワードがある状態だと、コードの補完が効かなかったり重い時があった ので、そのときは一時的にmacroキーワードを消すと快適にmacroクラスの実装が できた 実際どこまで正しくコードが生成されているか、やmacro実行時に変数に格納され ている情報を知るためのデバッグ用コードを用意してあげると幾分楽になる

28.

デバッグ用のコード

29.

デバッグ用のコード

30.

デバッグ用のコード

31.

(時間が許せばここまで )

32.

まとめ ● Macro使えばFirestore周りのボイラープレートになりがちなコードを自動生成化で きそう ○ ● 今回紹介したケースのように、json codableともいい感じに組み合わせできそう ○ ● 今回の例だとモデル定義に直接 Macroを適応するようにして簡略化したが、実際には `@FirestoreRepository`みたいに、Repositoryクラスに適応する Macroにしても良さそう ただ、Firestore独自の型の変換の問題が残るので場合によっては引き続き freezedとの組み合わ せになるかも Macroが実際のプロダクションコードに適応できるようになる日が 待ち遠しい...!

33.

積極採用中 ● ● Flutter/Web/QA/PdM採用中です...! まずは副業(業務委託)から、でもご興味あればお声がけください! https://corp.hokuto.app/recruit

34.

参考資料 ● ● Macros (experimental) 今日紹介したコードのサンプル(GitHub Gist)

35.

ご清聴ありがとうございました