Fletを使って実際に業務アプリを作った感想

# Fletとは
Pythonでマルチプラットフォームアプリが作れるフレームワークです。
現状そこまでメジャーではないですが、最近徐々に流行り出している傾向があると思っています。

私が使い出した経緯はこの記事で語っております。

https://qiita.com/ForestMountain1234/items/bc709c3599ee86e2a0dd

今回はこのFletを実際に業務アプリとして採用した結果を共有していこうと思います。
Fletについて気になっている人は是非参考にしてみてください。

# Fletの優れているところ
## 1. とにかく手軽
Fletは、特殊な構文等が一切ない純粋なPythonでUIを構築する事が出来ます。
GUIアプリを作る時に一番ネックになるのが画面デザインの構文ですよね。webアプリであればHTML/CSSが必要ですし、WindowsアプリだったらXAML、同じくPythonのフレームワークkivyも独自の構文を採用していたりと、割とフレームワーク毎に学びなおす必要があるかと思います。

ですがFletは構文自体は紛れもなくPythonであり、UIのツリー構造を単なるオブジェクトの組み合わせで構築する事が可能です。しかもプロパティ名も特殊なものでなく、「margin」や「padding」「border」等web経験者にとっては聞きなじみのある者が多く、余計な学習コストがかかりません。

しかもFletの開発環境構築は```pip install flet```をするだけです。そして純粋なPythonコードですので、動作検証するのにビルドが一切必要ありません。何という手軽さでしょうか。

この手軽さのお陰で、完全初見のフレームワークにも関わらず**数時間程度で実際のアプリ開発に取り掛かる**事が出来ました。

独自の概念等が無いのは新規学習者にとってはやはり大きいですね。

## 2.いい感じのUIが簡単に作れる
元となったのがFlutterであるため、基本何も考えなくてもいい感じのUIになってくれます。元が優秀なので、基本的にカスタマイズしなくても大丈夫ですが、凝ったデザインにしたい際は各コンポーネントのプロパティを弄る事で形や色を変える事が出来ます。

また、レイアウトの方法も直感的で分かりやすいです。CSSで例えるならFlexBoxに近いです。縦に並べる「Column」と横に並べる「Row」というコンポーネントがあり、各子要素は「固定幅(px)」か「可変幅」を指定する事ができます。何も指定しなければ自動でサイズ調整してくれます。

そしてアイコンも標準搭載しており、そんまんま「Icon」というコンポーネントを使う事で簡単にアイコン付のボタン等を実装する事ができます。

そのため、**UI/UXを意識したアプリを作る際は特に有力候補に挙がる**フレームワークだと思います。

## 3.ホットリロードが優秀
最近のフレームワークな事もあり、標準でホットリロードを搭載しています。
具体的には、```python ファイル名.py```の代わりに```flet run ファイル名.py -d```というコマンドを打って実行するだけです。
ホットリロード機能のお陰で、スタイル調整やレイアウト調整の結果が即座に確認できるので、非常に画面の開発がしやすいです。またこのホットリロードはUI部の変更だけでなくすべてのpyファイルの変更に対応しているので、ビジネスロジックを扱うモジュールを変更した際もホットリロードが発動するのでデバッグ・動作検証も容易に実行できます。

## 4.公式ドキュメントが分かりやすい
新興フレームワークにありがちな「学習資料が少ない」という問題を、Fletは公式ドキュメントの充実差でカバーできています。勿論メジャーなものと比べると量は劣りますが、私が開発していた時に**ドキュメント不足で困った事は殆どありませんでした。** 元の構造が直感的でシンプルなのも大きいでしょうか。
基本的に必要な情報は全部公式ドキュメントに「分かりやすく」記述されているといっても過言ではないでしょう。（勿論英語なのでGoogle先生に頼る事になりますが。）

https://flet.dev/docs/controls

## 5.マルチプラットフォーム対応
Fletの売りである「マルチプラットフォーム対応」ですが、少し弄るだけで簡単にデスクトップアプリとWebアプリを切り替えることができます。exe化する際にはPyinstallerを使うので、勿論Windows/Mac/Linuxにも対応可能です。これはプラットフォームが決まり切ってないような場面だと非常に安心感がありますね。最近ではiOSにも対応した？ようです。


# Fletの微妙なところ
## 1.複雑なアプリを作るには工夫が必要
Fletは**小規模なアプリを素早く作る事を想定して設計されている**ため、中～大規模アプリに採用しようとするとボロが出てきます。
まずデータバインディング機構が無く、完全に手続き型の画面制御を行う必要があるため、そのままだとスパゲッティコード化します。なので私は簡単なデータバインディング機構を自作することで代用しました。

正直気合いでやったので、もっといい方法があれば教えて欲しいです。

https://qiita.com/ForestMountain1234/items/64edacd5275c1ce4c943

また、フレームワークとはいえあくまでも「UIフレームワーク」の様な位置づけであるため、外部リソースやビジネスロジック部と画面をどのように連携させるかは個人の裁量にゆだねられています。

私はレイヤードアーキテクチャを参考にしたアーキテクチャを構築しましたが、それに至るまで3~4回くらい設計変更しました。やはり新興フレームワークなので、どのフォルダ構成が正解なのか分からないのは少し辛いかもしれません。

ただ、フォルダ構成で困るのは中規模アプリに片足突っ込みだした辺りからなので、ちょっと使う分にはあまり欠点にはなり得ないかもしれません。

## 2.エコシステムが少ない
当然ですが、エコシステムは殆ど無いといっても過言ではありません。UIコンポーネントは基本的に自作ですし、足りない機能は外部ライブラリを上手く組み合わせて実装する必要があります。なので**凝ったことをしようとすると少し時間がかかります。**

## 3.exe化した後の起動が遅い
根本原因はPyinstallerを使っていることにあるのですが、Fletで作ったexeファイルは起動が遅いです。**低スペックPCだと30秒以上かかる事もあります。** あとスプラッシュスクリーン(Office系で起動中に出る小窓のようなやつ)も出せないので、ユーザーからしたら「起動してるの？これ」となること間違いなしです。実際に待ちきれずユーザーが起動中に3回クリックして同じアプリが3個起動したのを目にしました。

一応この問題に関しては、ビルド時に```--one-dir```というオプションを付ける事で改善可能です。これはデフォルトが1ファイルに全てまとめる設定になっており、その1ファイルに纏められた各種ライブラリを起動時にこっそり解凍しているのが原因になります。one-dirオプションを付けるとその解凍処理がいらなくなるため起動が早くなります。具体的にはonefile時に30秒だったのが3秒で起動しました。
ただその分配布が面倒になるので一長一短ですね。

## 4.テストが自動化できない
現状、FletアプリのE2Eテストをする有効な方法は用意されてありません。
無理矢理実装するとしたらそれこそpyautoguiでマウス操作を自動化する事になるかもしれません。
可能性としてあるのは、webアプリとして起動した上でSeleniumで自動テストする事でしょうか。ですが試したことがないので不明です。

## 5.安定感がない
新興フレームワークなので仕方ないですが、Fletを最新バージョンにアップデートすると、今まで動いていた画面がバグで動かなくなったりすることがあります。
また、基本機能は一通りそろっていますが、痒い所に手が届かない事がたまにあるといった印象があります。
執筆当初のFletはver.1.0.0に到達しておらずまだ未完成な部分も多いですので、**安定稼働が必要な基幹システムには特に向いてない**と言えます。

# 総合評価
## Fletが向いている場面
- 小規模アプリ・一時的なアプリを作りたいとき
- Pythonの豊富なライブラリを使ったアプリを作りたいとき
- 開発の手軽さとUI・UXを両立したいとき
- Pythonを使える人が周りに多い時

## Fletが向いていない場面
- 大規模アプリや基幹システム等への採用
- 複雑な動きをするUIを作る場合


# 最後に
総じて、プロジェクトの規模感が大きくなければ非常にベストな選択肢ではないかと思います。特に部門内でのみ使うような業務アプリとの親和性が高いですね。

ただ、まだ安定的とは言い難いので、私のようにFlet以外の選択肢がないような状況でなければ、中規模くらいのプロジェクトへの採用は様子見した方がいいかもしれませんね。

ただ私はアプリを一通り開発してみて、このフレームワークは非常に気に入りましたので、今後も積極的に使っていき情報発信をしていきたいと思います。