
Flutterでデスクトップアプリを開発しています。諸々の条件が重なっていまだリリースできていませんが、Flutterでのデスクトップアプリ開発について感想が固まってきたので先に書いておこうと思います。
初の記事から煽りっぽいタイトルになってしまいましたが、そのままの内容です。Flutterを腐す意図はありませんので、この記事を「Flutterはオワコン(n回目)」や「やはりクロスプラットフォームのツールは失敗する(n回目)」といった煽りに使うのはご遠慮ください。なお、私はFlutterで後悔していません。
Flutterでデスクトップアプリ開発のメリット
まずは個人的に考えるメリットを挙げておきます。Flutterに関心のある人はすでにご存知と思いますので簡単に。
- クロスプラットフォーム
- プラットフォーム間でUIを共通化できる
- ネイティブコードと連携しやすい
- 独自のレンダリングエンジンを持っているのでネイティブUIの癖に振り回されない(これは同時にデメリットにもなります)
今はクロスプラットフォームのデスクトップアプリ開発にも他に有力な選択肢がいくつもあり、Flutterに突出したメリットはないように思います。私は元々Flutterにデスクトップアプリ開発のツールとして期待していましたし、使用感も気に入っていたのでそのまま採用しました。
ただ、独自のレンダリングエンジンはメリットにもデメリットにもなります。特にそのデメリットが顕著になったのが、先日アップルが発表した Liquid Glass です。この新しいデザインはアプリで隠れた背景にエフェクトをかけてガラスのように透過して見せるもので、ネイティブUIを覆ってしまう独自のレンダリングエンジンと相性がよくありません。まあいつかWWDCでSwiftUIがWindowsとLinuxをサポートして「SwiftUIこそが真のクロスプラットフォームです!」と言い出しそうなアップルが単純なエフェクトで済ませるはずもありませんから、再現は簡単ではないでしょう(早くも挑戦は始まっています)。また、再現できたとしても最新の仕様への追従は常に後手に回ります。渾身の力作Liquid Glassは発表された直後にもかかわらず、ユーザーの意見を取り入れて最新のアップデートで大幅な変更が加えられました。
Liquid Glassへの対応が絶対にできないかと言うと、そうでもありません。ネイティブUIを利用するバインディングで実装可能です。手元で実装してみて確認しました。(ソースコードはNDAを考慮して公開していません)
Flutterをデスクトップアプリ開発におすすめしない理由
基本的な機能のサポートが弱い
一応Flutterはデスクトップアプリ開発を公式にサポートしており、ビルドは特に問題ありません。バージョンが変わるとビルドエラーが頻発するとか、特定のプラットフォームだけ挙動がおかしい機能があるとか、そのような苦労は少ないほうだと思います。
ただ、機能的にネイティブと遜色ないアプリが簡単にできるかというと別で、公式ライブラリにあって欲しい機能がサードパーティー頼りだったりします。ファイル選択ダイアログは file_picker 、プラットフォーム固有の特殊なディレクトリパスの取得は path_provider 、ウインドウ操作は window_manager といった感じです。幸いだいたいの機能はどうにかなりますが、なんというかこう、足場が揺れている感じがします。
ジェスチャー検出に工夫が必要
ジェスチャー検出APIには低レベルAPIと高レベルAPIがあります。低レベルAPIはデバイスの単純な操作を検出し、高レベルAPIでダブルタップやドラッグなどの判別を行います。一般的に使うのは高レベルAPIです。
ネイティブのジェスチャー検出と比べると、高レベルAPIは反応がやや遅れます。ダブルタップなどの判定に猶予を設けているためです。モバイルアプリだとわずかに気になる程度かもしれませんが、デスクトップアプリだとネイティブアプリとの体感の差が目立ちます。工夫しないとユーザー体験がお世辞にもよいとは言えません。
ではどうするかと言うと、高レベルAPIの一部の判定をアプリの仕様に合わせて自前で実装するか、場合によっては低レベルAPIを使って主要なジェスチャー判定を実装するのが最善かと思われます。私は ネットワークグラフ描画ライブラリ も同時に仕方なく実装を進めていて、このライブラリでは各種ジェスチャーを仕方なく低レベルAPIで実装しています。
マルチウィンドウのサポートが弱い
現時点ではサードパーティーのライブラリによるマルチウインドウ対応はできなくはないものの、諦めたほうがよいかと思います。ライブラリの出来の問題ではなく、仕組み的に公式でどうにかしてもらわないと無理という印象です。シングルウインドウでどうにかしましょう。マルチウインドウを公式にサポートしてくれそうな気配はありませんし...
Flutterが選択肢に上がるかもしれない状況
それでもFlutterが候補になるなら、以下のような条件を満たす場合かと思われます。
- Flutterで実装した膨大な資産を抱えている
- Flutterの膨大な知見がある
- 不足する機能を自前で実装する気力がある
ライブラリの量はどうしてもネイティブやフロントエンドの言語に劣るので、他の言語なら存在するのにFlutter/Dartにはないライブラリを自前で実装しなければならない機会は多いでしょう。最近はAIが強力になったとは言え、コードが増えないに越したことはありません。
おわりに
クロスプラットフォームのデスクトップアプリの開発を考えていて、これからFlutterを学ぼうという方は他の選択肢の検討をおすすめします。どの選択肢でもデスクトップアプリは面倒でしょうが、Flutterは少々苦労が多くなると思います。