つばくろぐ @takamii228

知は力なり

FlutterにおけるPluginとの付き合い方 #flutter

本記事は Flutter #1 Advent Calendar 2020 の12/13の記事です。

qiita.com

Flutterでアプリ開発を行う時、 pub.dev で公開されているプラグインを使うことで特定の実装やネイティブ実装を代用することができます。

このときそのまま公開されているプラグインを使うか、自作でMethodChannelとネイティブコードで実装するか選択することができます。本記事では私が普段どのような考え方で判断しているかを一例として紹介したいと思います。

なお今回はWebやDesktopは含めず、iOSAndroidアプリに絞った話になります。

Flutterにおけるプラグイン

Flutterにおいてプラグインを利用する場合、pubspec.yamlに利用したいパッケージ名を記入した状態でflutter pub getを実行することで利用することができます。

flutter.dev

プラグインを使うメリットとデメリット

Flutterにおけるプラグインを使うメリットとデメリットを上げてみると以下のものが考えられます。

  • メリット
    • プラグインで代用することで実装を省略でき開発を高速化できる
    • iOSAndroidのネイティブ実装の知識がなくてもネイティブ機能が利用できる
  • デメリット
    • 自分の利用したいインターフェースや機能の実装になってない場合がある
    • プラグイン同士で含まれるライブラリが競合する場合がある
    • プラグインにバグが含まれている可能性がある
    • メンテナンスが放置されてFlutterのバージョンアップの足かせになる場合がある

まずメリットですが、そもそもFlutterという技術選択をした理由に開発の高速化が念頭にあることが多いと思うので、プラグインを利用することでさらなる高速化が望めます。 またWebViewやカメラなどのOSのネイティブ機能を使った機能を実装する場合は本来であればiOSAndroidの知識が十分に必要になりますが、プラグインを利用することでFlutterの知識があれば機能を実装することができます。

一方でデメリットでいうと、プラグインが提供するインターフェースが必ずしも自分が使いたい形式になっていなかったり、必要な機能を実装していないケースがあります。また複数のプラグインを組み合わせて使う場合、バージョンやライブラリの競合が起きるケースもあるでしょう。 OSSとして個人が公開しているものにはバグが含まれている可能性もあります。また利用し始めた当初は問題なかったけど、時間がたってからメンテナンスが放置されてFlutterのバージョンアップ時にエラーになる、なんてケースも考えられます。

これらのメリデメを踏まえてプラグインを使うべきか自力で実装すべきかをどのように考えていけばよいかを考察します。

プラグインを利用するか、自力で実装するか

まずプラグインを利用するか自力で実装するかについては答えはなく、プロジェクトの状況に合わせて最適な選択をするのがよいです。

iOSAndroidそれぞれ個別の実装している余裕がなかったり、そもそもネイティブ実装ができるメンバーがチームいない場合は結果的にプラグインを積極的に利用することになると思います。

一方で公開されているプラグインが提供する機能では不十分だったり、そのアプリが提供するコア機能となる部分として自由なカスタマイズをしたいケースであればプラグインを利用せずに自力で実装することになると思います。

FlutterではMethodChannelを使うことでネイティブで実装した機能を画面、部分的な画面、関数単位で実行することができます。

flutter.dev

プラグインの選定基準

次にプラグインの選定を見ていきます。

ネイティブの機能を利用するプラグインはある程度は公式が用意してくれているので、まずはそれを使って期待する使い方ができるかどうかを確認してみましょう。

github.com

Firebaseを利用する場合も公式が利用を推奨しているプラグインから選ぶとよいでしょう。

github.com

medium.com

3rd partyが公開しているSDKをラップしたプラグインを利用する場合もまずは公式が出しているものを見てみるとよいです。

その他のプラグインを利用したい場合は以下の観点で選ぶとよいでしょう。

  • 評価が高く、利用実績が豊富であること
  • ドキュメントが充実していること
  • ライセンスの自由度が高いこと
  • 更新が活発であること

利用を検討しているプラグインについては、ネイティブの知識がある程度必要になりますが、なるべく中身のソースコードも読むようにしましょう。ソースコードを読んでみて、これなら自分でも実装できそうだ、と判断したら自力での実装で切り替えるのもありだと思います。

プラグインへの依存と付き合っていく

自身のプロダクトにプラグインを利用するという選択をした場合、そのプラグインの依存関係を常に念頭にして追加開発・運用していく必要があります。

Flutterのバージョンアップや新OSが出たときに利用しているプラグインがきちんと対応できるのか、仮に対応できない場合はパッチを当てるのか、別のプラグインを検討するのか、利用をやめて自力で実装し直すのかなどを定期的に見直すようにしておくとよいです。

FlutterはそもそもそれだけでiOSAndroidを横断したフレームワークであるため、プラグインも含めるとかなり複雑な構成をとることとなります。そのため依存関係を正しく把握していないとあっという間に負債化してしまう可能性があるので注意が必要です。これについては以前ブログにまとめたのでそちらも見てみてください。

takamii.hatenablog.com

takamii.hatenablog.com

最近でいうと、長らくWebViewのプラグインとしてflutter communityのものがよく利用されてきましたが、ようやく公式のWebView Pluginが正式公開されましたね。

github.com

github.com

flutter communityの方のプラグインはもうメンテされないようなので新しい方に移行していく必要があります。

プロジェクトの状況にもよりますが、私が以前いたプロジェクトでは初期リリースはプラグインを積極的に活用して開発効率を重視し、追加開発フェーズである程度落ち着いてきたら pubspec.yamlを定期的に見直して少しずつ自力実装に移行していく、という戦略を取っていました。

まとめ

プラグインの利用によってその機能の実装を省略できる一方で、プラグイン自体のメンテナンスが放置されていて本体のバージョンアップの足かせになり開発スピードが落ちてしまった、という経験をWordPressやJenkinsなどで経験したことがある人もいるのではないでしょうか。

Flutterにおいてもそのようなことにならないように、プラグインの利用を検討するときはどのような観点で自力実装と使い分けているかをプロジェクト全体の方針として明確にし、利用しているプラグインを定期的に見直すようにしておくとよいでしょう。