Flutterを全面的に活用してアプリ開発をやっていて思うのは、Flutterを採用するデメリットが思いつかないです。その理由を書きます。

開発生産性の高さ

そもそもすごいのが、ワンソース・マルチユースを実現できること。Flutterで書いたコードは、iOS/Androidのアプリになります。XCode/AndrdoiStudioのプロジェクト形式に変換され、各々のネイティブアプリをリリースできるようになります。

同じアプリを2つの言語や開発ツールで実装する必要がなくなり、ライブラリのメンテナンスコストが大幅に削減されます。これは非常に大きなメリット。Dartの学習コストも高くないですし。ReactやってるJavaScriptデベロッパーの方なら、すんなり入れそう。自分はReactの経験がないので、憶測ですけど。

パフォーマンスの高さ

クロスプラットフォームフレームワーク自体は結構前からあります(結構消えていったけど)。古いところだとTitanium Mobileとか、今だとXamarin / React Native / Kotlin MultiPlatform などでしょうか。その中で後発のFlutterが優れていたのは、ハイブリッド・アプリではなく、ネイティブアプリをそのまま実装する方式を採用したことによる、パフォーマンスの高さだと思います。エンジンの出来が違います。

ハイブリッド・アプリというのは、ネイティブの皮を被ったWebアプリのようなものです。WebViewの中で動かすやつで、どうしても動作がもっさりと感じられます。ネイティブアプリに比べると。また、ハイブリッドアプリのお作法にも対応しなくてはなりません。コストは下がるかもしれないけど、表現力に劣るデメリットのほうが大きいという印象です。

Flutterが作っても描画が遅かったら意味がないけど、ネイティブと遜色ないレンダリングの速さです。

開発体験が極めて優れていること

心地よいUI開発

Flutterからモバイルアプリの開発に入った方には伝わらない部分ですが、従来のネイティブ開発に比べて、Flutterでの開発手順は洗練されていると強く感じます。

従来のネイティブアプリの開発はUIの構造・画面遷移・デザインなどが統一的な仕組みではなく、標準で用意されているUIコンポーネントの表現力も足りないと感じます。UI絡みのライブラリをかなり多く使用した記憶があり、iOS5の頃と大きく変わってない印象です。Flutterでは、かなり豊富にウィジェットが用意されています。

FlutterはUIや画面遷移などを全てをコードで記述し、宣言的UIを採用しました。ReactやVueで採用されているスタイルです。UIをビルドして作る時代に最適化されたスタイルを踏襲していると言っても過言ではないでしょう。UIの記述が宣言的になると、そのUIの責務がスッキリと書けます。特にColumnの中にRowを入れるなど、divのネストでグリッド的なレイアウトを組むのが、Flutterは極めてやりやすい。これをStoryBoardでやるとだるくてしょうがないだろうな、という印象です。コンフリクト避けるために、画面グループ単位でStoryBoard作っていると聞いたことある。バッドノウハウだよな。

画面のレンダリングの速さ(Hot Reload)

通常ですと、アプリの動作確認に再ビルドが必要です。コードを直して保存すると、その内容がシミュレーターや実機に反映されるわけではない。以下の手順を取ります。

  1. コードを修正して保存する
  2. ビルドを走らせる
  3. シミュレーターや実機に反映されるのを待つ

基本的にはこれだけなんですが、②〜③のプロセスが結構だるいんです。ビルドというのは、全てのソースコードや付随するライブラリを全部チェックして配布可能なアプリを作る工程なので、まあまあ時間がかかります。修正内容を確認するまでのタイムラグはだるいんです。

Flutterは見事な後出しジャンケンで、Hot Reloadを搭載しました。ソースコードを編集するだけで差分が有効になり、UIの再構築が走って画面が変わります。保存を押したらシミュレーターに移動して確認できるスピード感が最高です。

エコシステムの急速な成長

エコシステムの大半はOSSで公開されているライブラリ群のことなんですが、年々様々なライブラリが開発されている印象を受けます。ライブラリの多くは、通信管理、シャレオツUI、ファイル操作、状態管理などに利用しています。

個人的に、Riverpod+StateNotifier+Freezedの組み合わせに大いに満足してます。iOS/Androidには、同質の組み合わせはないのではないと思われます。あったらごめんなさい。

状態管理がパシッと決まると、モデルのコードはどんどんシンプルに、そして単体でテスト可能になっていく。それを実感しました。

Flutterを採用するデメリットはあるのか?

無いです。あったら教えて下さい。あったとしても、上記のメリットを打ち消すほどのインパクトではないでしょう。

強いて言えば、iOS / Android OSがバージョンアップして、新しい機能が搭載され、それらを追従するのにタイムラグが有ることでしょうか。今だとMaterial You(Android 12で初披露)の対応などです。私のまわりでは、幸運なことに最新化対応の追従が最優先されるケースはないので、大きなデメリットにはなりませんでした。ネイティブコードを呼び出さないと行けないケースにも、今の所遭遇したことがありません。

技術者の確保問題は、Flutterを採用したことで加速する(比例する)ものでもないでしょう。Flutterは新しい技術なので、習熟した人が増えるまで時間はかかります。実績もまだまだ少ない。でも、実績は作るものであって、眺めるもんじゃない。

私は、Flutterがこれからのモバイルアプリ開発のスタンダードに、天下を取るクロスプラットフォームになると思っています。真面目に。それぐらい衝撃を受けました。

最大のデメリットは、GoogleがFlutterプロジェクトを解散することでしょうか。Google Waveのように。ま、その時はネイティブ開発をやり直すだけですね。

Flutterでリプレイスするケースがどんどん増える

中途半端にネイティブに手を出したはいいが、技術者の確保やメンテナンスコストの増大で困っている、新しい機能やバージョンを出したいけどおっつかない。そんな場合に、Flutterで再構築して作り直そうって機運は絶対強くなると読んでます。式年遷宮で一挙両得狙い。2023年頃かなと踏んでます。