BETA

Flutterを実務で使ってみてイケてなかったこと7選

投稿日:2020-05-14
最終更新:2020-05-15

Flutter v1.0.0が2018/12/5に公開されてから、一年と半年が経ちましたね。
だいたいQ単位で新しいバージョンがstableに登場しており、先週にはv1.17.0も公開されました。(既にv1.17.1が出ているようです)

Flutterコミュニティはとても活発で、最近は大手アプリがFlutterを採用している例を見ることが多くなってきているように感じます。
僕も実際に、Android/iOS向けアプリ開発にFlutterを採用して開発する機会があり、Flutterいいよな〜という気持ちです。

そんなFlutterですが、実務で使ってみると当然いいことばかりではなくデメリットというかハマりどころがありました。Flutterが盛り上がってきている今、Flutterのいいところは多くの記事がありますし、逆にFlutterを実務で使ってみてツラかった経験をご紹介します。

Flutter v1.0.0が出るちょっと前から、v1.12.13が出たあたりまでの知見ですが、Flutter採用にあたって悩んでいる方などの参考にしていただけたら幸いです。

新しいOS・機能への対応に時間がかかることがある

Android/iOSネイティブでできることはFlutterでも大体出来ます。

とはいえ、新しいOS・新機能・需要の低い(優先度が低い)機能の対応は、なかなか進まないことがありました。
例えばiOS13が公開された際、FlutterがXcode11対応するまで割と時間がかかってしまい、なかなかiOS13対応をすすめることができませんでした。Xcode11については、FlutterだけでなくUnityもなかなか対応がされなかったので、Xcode11固有の話かもしれませんが…

また、Sign in with Apple対応なども大変でした。

当時開発していたアプリはFirebase Authenticationを使って認証していたのですが、Flutterアプリで対応するためには、以下の対応を待たなければいけませんでした。

  • Sign in with Appleのリリース
  • ネイティブ向けのFirebase Auth SDKがSign in with Appleをサポート(このあたり
  • Flutter向けのFirebase Auth pluginがSign in with Appleをサポート

Sign in with Appleについては対応しないと審査に通らないということもあり、ネイティブアプリに比べると実装可能になるまでの待ち時間はどうしても長くなってしまうので、これはわかりやすいリスクかなと思います。

需要が低い(優先度が低い)機能として、
たとえばReproのFlutter対応などはまだまだこれからという感じです(repro_flutter

一部の公式pluginの出来がよくない

主要な機能については、Flutterチーム/Dartチームが大量に公開しており、たいていのpluginは特に問題もなくスムーズに使えます。
ただ出来の良くないpluginもありまして、例えばgoogle_maps_flutterは、ちょっとしたカスタマイズもなかなか出来ず大変でした。

一例をあげると、カスタムマーカーをマップ上に表示すると常に等倍画像が使われてしまい、非常に小さくなってしまうバグがありました。最終的に、ディスプレイのピクセル密度に応じて画像を使い分けるよう実装して回避しましたが、どうやらこの問題はまだ未解決のようですね…

map pluginは上記以外にも多く公開されているようなので、公式以外のpluginを試してみても良いかもしれません

中途半端にCustom Widgetを使うと、表示が乱れる

標準のWidgetをそのまま使う限りは、プラットフォームの設定をある程度サポートしてくれます。
例えばダークモードや、システムのフォントサイズ設定などですね。

しかしCustom Widgetを作ると、一部の機能は自分でサポートしなければならなくなります。

標準のWidgetとCustom Widgetの両方を使用している画面において、ダークモードを有効にしていると、ダークモードが適用されているWidgetとそうでないWidgetが混在して表示されることになるため、表示がヤバい感じになります。

たまにパフォーマンスの問題に直面する

公式でも謳っているように、パフォーマンスの面で問題になることはほとんどありません。

ただしたまに問題になることがあります。僕が直面したのはcamera + Firebase ML Kitによるバーコードリーダーを実装したときぐらいですが…

カメラ単体で使う分には問題にならないのですが、例えばカメラの映像ストリームをFirebase ML Kitに流し込んでバーコードを読み込むといった実装を行うと、古い端末ではかなり厳しいことになりました。だいたい他画面に重ねて表示するため、更につらい感じです。

このときは古い端末の場合は、カメラ解像度を下げられるように設定項目を用意するといった対応で回避しました。この問題はFlutterだけではなくAndroid/iOSネイティブアプリだったとしても、低スペック端末相手にどうするか、という問題かもしれませんね。

技術の進化スピードが早すぎる

FlutterはおおむねQ単位で新しいバージョンがリリースされます。
あわせてDartも新しいバージョンにあがっていくため、更新にあたって破壊的変更が入ってくると、その対応に時間を要します。

またpluginも同様に影響をうけるため、メンテナンスされていない or 遅いpluginを使っている場合は、自分で修正するか他pluginへの移行を検討する必要があり、追いかけるのが大変です。

知識面でも、僕が関わった開発ではproviderというpluginを開発初期の採用していましたが、どうやら最近はstate_notifierがアツいとの噂…

永続化の手段があまりイケてない

FlutterでSQLiteを扱えるsqfliteのようなpluginがあるものの、当時はFlutterで使えるORMフレームワークがなく、生のsql文を扱わないといけなかったりして大変ツラかったです。

kvsとしてはshared_preferencesというSharedPreferences(Android)とNSUserDefault(iOS)を扱えるpluginがあったのでそれほど困りませんでした。
後日公開されたhiveというpure-dartなpluginに完全移行しましたが…

改めて調べてみると、このあたりの情勢はけっこう変わってきているようです

Dart/FlutterのローカルDBの比較 - のんびり精進

Realmも対応予定とのことですが、これはまだまだ先そう…

中途半端にOS対応標準のUIに寄せようとするとツライ

これはクロスプラットフォームあるあるかもしれません
だいたいのAndroid/iOS向けアプリにおいては、OS標準のUIに寄せるか、独自デザインで実装するかの二択になるかと思います。

Flutterは標準としてMaterial Designをサポートしていますが、iOSライクなUIを再現したければCupertino (iOS-style) widgetsを使うことで、かなり寄せることができます。iOSではスクリーン左端からスワイプすることで、backの操作ができますが、こういったジェスチャーも実現可能です。

しかしOSごとに異なるデザインとすると、せっかくのクロスプラットフォームを使った意義が薄れてしまいますし、Cupertino widgetsの再現度が高いとはいえ、標準Widgetと比較すると、動作が気になることがあります。

たとえば、リストのovershootアニメーションを設定しつつ、SliverListViewでHeaderを設定する(リスト先頭にタブを置くなど)と、overshootアニメーション中にリストのドラッグ操作を行なうことで、リストのドラッグアニメーションがガタつく、というバグがありました。

最後に

Flutterが盛り上がってきており、採用を検討しているアプリ・サービスが増えてきている今、逆にFlutterを実務で使ってみてツラかった経験をご紹介しました。
Flutterは強力なツールですが、デメリットやリスクを把握した上で使うことで、更に効果的に活躍してくれるのではないでしょうか。

僕自身はFlutterに大きな可能性を感じており、Android/iOS向けのアプリ開発・あるいはAndroidアプリだけでもFlutterで実装しようと、機会を虎視眈々と狙っているため、この記事が機会創出のきっかけになったらうれしいところです。

技術ブログをはじめよう Qrunch(クランチ)は、プログラマの技術アプトプットに特化したブログサービスです
駆け出しエンジニアからエキスパートまで全ての方々のアウトプットを歓迎しております!
or 外部アカウントで 登録 / ログイン する
クランチについてもっと詳しく

この記事が掲載されているブログ

daimaromの技術ブログ

よく一緒に読まれる記事

0件のコメント

ブログ開設 or ログイン してコメントを送ってみよう