2.5K Views
September 20, 24
スライド概要
YOUTRUST x HOKUTO x ゆめみ Flutter LT会@渋谷 #6 の登壇資料です。
https://yumemi.connpass.com/event/325435/
HOKUTO Inc. CTO
Dart Macros x Firebase Suguru Kishimoto 2024.09.20 Flutter LT w/YUMEMI, YOUTRUST, HOKUTO
自己紹介 ● ● ● Suguru Kishimoto (@su-, sgr-ksmt) 株式会社HOKUTO CTO 経験 ○ ○ ○ ○ ● エンジニア12年くらい Firebase7年くらい Flutter4年くらい CTO 半年ちょっと 好きなWidgetはCard Widgetです
メディア+ツールが融合した 次世代の情報収集アプリ HOKUTO インプットから臨床現場でのアウトプットまで、 医師の医学情報収集をフルサポート アウトプット ツール機能 ・臨床現場で知りたい情報を素早く確認 インプット メディア機能 ・最新の医学情報をタイムライン形式で入手 ・気になる情報はお気に入りにストック&必要な時 に再活用 3
Dart Macros x Firebase
Dart Macros ● ● 静的メタプログラミングをサポートするための新しい言語機能 build_runnerなどでコード生成するのではなく、コードをコンパイル時に動的に生成 ・修正できる ○ ● 静的解析も有効になるし、 Hot Reloadで素早く適応もできるのが嬉しい まだ開発中のものではあるので、正式版になるのが待ち遠しい ○ 公式からも jsonパッケージが出ているが、これもまだ安定版ではない
話すこと・話さないこと ● 🙆 話すこと ○ ● Firebase Cloud Firestore周りのコードを Dart Macrosを活用して生成してみる 🙅話さないこと ○ ○ ○ Firebase/Flutter周りの基本的な部分など Dart Macrosを使うためのセットアップ Dart Macros周りで出てくる APIの詳細など
Flutter x Firebase
だいたいこんなコードを書く ● モデルの定義 ○ ○ ● freezed, json_serializable使っていることが多い 必要に応じて Timestamp型<>DateTime型の変換をする Converter書いたり コレクション、ドキュメントのパス ○ ○ ○ CollectionReference, DocumentReferenceの定義をどこかしらに書く withConverterで、freezedで生成したモデルの from/toJsonを渡すと、snapshot.data()が指定した 型になるので扱いやすい
だいたいこんなコードを書く
だいたいこんなコードを書く
マクロ使って楽したい 😌
Macro書いてみる
Macro書いてみる
Macro書いてみる
Macroを適用する
生成されたコード
いい感じに生えてきた 🎉
呼び出してみる
良さそう!
(ここからは時間が許せば )
さらなる改良をしたい ... ● ● builderを介して対象のクラスからfield名などが取れるので、where句で指定する部 分をタイプセーフにしたい タイプセーフにするための周辺コードも合わせて自動生成してみたい
完成予想図
完成予想図 (使用感)
コード生成してみる (TBD)
しかし...
うまくいかない ● MemberDeclarationBuilderのdeclareInLibraryでは、`The macro attempted to add declaration(s) not allowed during the declarations phase.`というエラーが出て、classは生成できなさそう ● もしかしたらLibraryDeclarationsMacroを使うといいのかもしれない ○ ○ が、そこまではまだ調査しきれず ... もし解決策わかるよって人がいたらこっそり教えて下さい !
macroを書くときの tips ● ● `macro` キーワードがある状態だと、コードの補完が効かなかったり重い時があった ので、そのときは一時的にmacroキーワードを消すと快適にmacroクラスの実装が できた 実際どこまで正しくコードが生成されているか、やmacro実行時に変数に格納され ている情報を知るためのデバッグ用コードを用意してあげると幾分楽になる
デバッグ用のコード
デバッグ用のコード
デバッグ用のコード
(時間が許せばここまで )
まとめ ● Macro使えばFirestore周りのボイラープレートになりがちなコードを自動生成化で きそう ○ ● 今回紹介したケースのように、json codableともいい感じに組み合わせできそう ○ ● 今回の例だとモデル定義に直接 Macroを適応するようにして簡略化したが、実際には `@FirestoreRepository`みたいに、Repositoryクラスに適応する Macroにしても良さそう ただ、Firestore独自の型の変換の問題が残るので場合によっては引き続き freezedとの組み合わ せになるかも Macroが実際のプロダクションコードに適応できるようになる日が 待ち遠しい...!
積極採用中 ● ● Flutter/Web/QA/PdM採用中です...! まずは副業(業務委託)から、でもご興味あればお声がけください! https://corp.hokuto.app/recruit
参考資料 ● ● Macros (experimental) 今日紹介したコードのサンプル(GitHub Gist)
ご清聴ありがとうございました