Open4

Flutter × Kotlin Multiplatform by CyberAgent #6

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 を使って、インストラーを作成
  • アップデートに対応するなら auto_updater が良さそう
    • 検証中
  • 手動印刷だとできる / 自動印刷だとできない
    • エラーを検知する仕組みがないので、 stackdriver_dart を作って公開した

既存プロジェクトにKMMを導入するための対応策

これまでの話

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 で呼び出す必要がある
ログインするとコメントできます