Open4
Flutter × Kotlin Multiplatform by CyberAgent #6
イベント情報
twitter hash tag
YouTube
まとめ
Dart での Static Meta Programming
Flutter 2022 の ロードパップ
Meta Programming をコンパイル時に行う → コンパイル時にエラーを出してくれる
proposal ではマクロで提案されている
正しいタイトルは 「Dart でのマクロ」
マクロの背景
重複したコードが作られることが多い
したの例だと Cat とかも作りたい
class Dog {
final String breed;
final String name;
Object toJson() => {
'breed': breed,
'name': name
};
}
解決するためには
- 解決策
- build_runner のコードの自動生成
- dart:mirror/reflection
- 問題
- 重い・パフォーマンス・コードサイズ問題
マクロを作ると
- コード生成と違い高速に build ができる
マクロができること
- Dart で記述できる
- プログラムを利用した上で、既存コードを変更できる
マクロの適用
- @freeze のようにマクロを指定できる
- 引数を渡すこともできる
- 式 / 識別子 / 特別の方のリテラル値
Phase
Phase1. Type
- class / enum / typedef をトップレベルに宣言できる Phase
- マクロクラスはできることができない
Phase2. Declarations
- 関数 / 変数 / メンバーを定義する Phase
- クラスのメンバーとスーパークラスを知った上で処理ができる
- スーパークラスのメンバーにはアクセスできない
Phase3. Definitions
- 既存のメソッド・コンストラクタをラップして処理ができる Phase
- 全てのデータを操作することができる
マクロを入れると良いこと
- build_runner を毎回実行しなくて良い
- マクロはコンパイル時に実行される
- 実行し忘れのコンパイルエラーがなくなる
- CIでの実行時間が数十秒減る
- CI の課金が減る 👍 👍 👍
- コード生成のハードルが下がる
- build_runner 用のパッケージを作る必要がなくなる
参考文献
Flutterを使ったWindowsアプリの作成
blog にも公開しました 🎉 🎉
FlutterでWindows用のアプリを作成する
今だと stable のバージョンがリリースされている。
x Firebase
- Flutter 向けに Firebase SDK が出ているが Windows は対応していない
- Dart で Firebase の REAT API をアクセスしている
x 内部 API
- Open API が提供されているので、 API の部分を Open api generator を利用している
印刷
- printing のパッケージを使っている
- font は Google font を使っている
Windows アプリの問題
- システムトレイに入れておきたい system_trai を利用した
- 多重機動防止→アプリが起動されているときに、既存を表示 / 新規を閉じる するように制御している
- Proxy の問題
- 認証がある場合は、認証情報が必要だったため、手動で登録できるように対応をした
配布
- セキュリティの問題もあるので、インストーラを作成する
- インストーラを作成するパッケージ(msix)の利用
- Windows10 1709 以降のバージョンのみ対応している
- 以前のバージョンは使えない
- Visual Studio を使って、インストラーを作成
- 以前のバージョンは使えない
- Windows10 1709 以降のバージョンのみ対応している
- インストーラを作成するパッケージ(msix)の利用
- アップデートに対応するなら auto_updater が良さそう
- 検証中
- 手動印刷だとできる / 自動印刷だとできない
- エラーを検知する仕組みがないので、 stackdriver_dart を作って公開した
既存プロジェクトにKMMを導入するための対応策
これまでの話
- アプリのリニューアルを進めながら KMM 化を進めている
- 設計に関しては Multiplatform Engineering Roadmap for the Future にて話している
Before 2021/11
- Android / iOS の仕組みが存在する
- それぞれバージョンは同じバージョンを指定する
- KMM
- 複数のモジュールをiOS向けに1つにまとめるモジュール
After 2021/01
groups
- 機能の単位で subproject としておいている
- 特集(Feature), マイリスト(MyList), 検索(Search), 放送枠グループ(SlotGroup)
- group の中の分け方
- domain / apiservice / repository / usecase / usecase IF
core
- それぞれの groups で共有するものを core として、定義している
- core に破壊的な変更をすると、全ての groups に影響するので、後方互換を心配する必要がある
api service について
- API Client は存在するが、それぞれの domain 固有の問題が存在するため、独自で実装をしている
新機能開発
-
マイビデオ
・通知予約
をマイリスト
に集約するプロジェクト - アプリですでに実装されているものを KMM で呼び出す必要がある