ls -al

仮想通貨やプログラミングに関する事などをつらつらと書き綴ります

既存のプロジェクトにFlutterを追加する

既にJava/Kotlinで制作されている旧来のプロジェクトに後からFlutterを導入する方法を調べました。


まえがき

 個人で制作しているアプリにFlutterを使いたいと考えましたが、どうも一筋縄ではいかないようでした。逆の場合(Flutterで作られたプロジェクトにJava/Kotlinのコードを混ぜる)なら簡単にできるようで、公式にもそのようなページが存在しています。Gradleをうまいこと設定してやることで所望の構成でビルド出来るところまでこぎ着けたのですが、ホットリロードが効かず、Flutterを導入した意義の半分くらいが失われるということになりました。もう少し調べてみると、このようにFlutterを扱いたいというニーズは存在するようで、少し前からissueを立ててこのあたりの改良を行っているようです。今回それを参考にしたところ、上手く行ったので共有します。


注意点

 この方法は 開発中 の機能を使います。そのデメリットをよく理解した上で参考にしてください。


方法

この記事を参考にして行います。試しに行ってみたリポジトリがこちらになります。

  1. Flutterのブランチをmasterに切り替える
    この機能はmasterブランチにのみ取り込まれています。betaalphaなどを使っている場合はこちらに切り替える必要があります。

  2. Flutterモジュールを作る

    flutter create -t module {{module_name}}

    参考元では既存プロジェクトの一つ上のパスで作っています。

  3. 既存プロジェクトのsettings.gradleを編集する
    参考元を踏襲して既存プロジェクトの一つ上のパスにFlutterモジュールを作った場合は以下を追記

    setBinding(new Binding([gradle: this]))
    evaluate(new File(
    settingsDir.parentFile,
    '{{module_name}}/.android/include_flutter.groovy'
    ))

    evaluate()に使いたいFlutterモジュールのinclude_flutter.groovyを指すFileクラスのインスタンスを渡すようにしてください

  4. 既存プロジェクトのapp/build.gradleを編集する
    dependenciesに以下を追記

    implementation project(':flutter')

これで既存プロジェクトでFlutterを扱えるようになりました。

View flutterView = Flutter.createView(
    MainActivity.this,
    getLifecycle(),
    "route1"
);
FrameLayout.LayoutParams layout = new FrameLayout.LayoutParams(600, 800);
layout.leftMargin = 100;
layout.topMargin = 200;
addContentView(flutterView, layout);

こんな感じに扱うことができます。
flutter run,flutter attachを使うことでホットリロードも使える状態です。ただし、この状態ではdartファイル保存時に自動でリロードは行わず、ターミナルでrを入力しないとリロードは行われません。


参考