既存のプロジェクトにFlutterを追加する
既にJava/Kotlinで制作されている旧来のプロジェクトに後からFlutterを導入する方法を調べました。
まえがき
個人で制作しているアプリにFlutterを使いたいと考えましたが、どうも一筋縄ではいかないようでした。逆の場合(Flutterで作られたプロジェクトにJava/Kotlinのコードを混ぜる)なら簡単にできるようで、公式にもそのようなページが存在しています。Gradleをうまいこと設定してやることで所望の構成でビルド出来るところまでこぎ着けたのですが、ホットリロードが効かず、Flutterを導入した意義の半分くらいが失われるということになりました。もう少し調べてみると、このようにFlutterを扱いたいというニーズは存在するようで、少し前からissueを立ててこのあたりの改良を行っているようです。今回それを参考にしたところ、上手く行ったので共有します。
注意点
この方法は 開発中 の機能を使います。そのデメリットをよく理解した上で参考にしてください。
方法
この記事を参考にして行います。試しに行ってみたリポジトリがこちらになります。
Flutterのブランチを
master
に切り替える
この機能はmaster
ブランチにのみ取り込まれています。beta
やalpha
などを使っている場合はこちらに切り替える必要があります。Flutterモジュールを作る
flutter create -t module {{module_name}}
参考元では既存プロジェクトの一つ上のパスで作っています。
既存プロジェクトの
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クラスのインスタンスを渡すようにしてください既存プロジェクトの
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
を入力しないとリロードは行われません。