Flet vs Streamlit　

## 結論
個人的には、ただ検証でサクッと作るのであればstreamlitで、検証もしつつ汎用的なアプリを作成したいというのであれば、UIや状態管理の柔軟性もありマルチプラットフォームのFletという印象  

あとめちゃくちゃ個人的にですが、Fletはflutterみたいな見た目になるのでなんか作ってて少し楽しいです  
これをみてなんか少し気になるなーと思った方ぜひ遊んで見てください

## 比較項目
| 特徴/利点        | Streamlit | Flet                  |
| ------------ | --------- | --------------------- |
| 使いやすさ        | 非常に使いやすいが詳細なデザインはできない  | 使いやすいが詳細なデザインには時間がかかる |
| データサイエンスとの相性 | 高い        | 中程度                   |
| リアルタイム更新     | あり        | なし                    |
| デプロイの容易さ     | 簡単        | 中程度                   |
| デザインの自由度     | 限定的       | 高い                    |
| 多用途性         | 主にWebアプリ  | Webおよびデスクトップ/モバイルアプリ       |
| コミュニティ  | ある程度豊富        | やや限定的(これからに期待)  |
|初期ロード時間|結構長い|短め|
|インタラクション速度|一般的に迅速だが、大量データで遅延|迅速だが、複雑なロジックで遅延|
|バックエンド処理|シングルスレッド、重い処理で影響あり|シングルスレッド、非同期処理で改善可能|
|キャッシュ機能|あり|限定的|
|パフォーマンス最適化|st.cache、スクリプト分割|非同期処理、効率的レンダリング|

## Streamlit
[Github](https://github.com/streamlit/streamlit/tree/develop/frontend/app)  

### 使いやすさ
フロントエンドは基本React.jsで記述されている(Vueでも作成可能)  
色々[コンポーネントが用意されている](https://docs.streamlit.io/develop/api-reference)ためそれらを選ぶだけでそれっぽいアプリを作成できる  
webアプリで基本使用するようなもの(ボタン,Inputボックス,サイドバー,タブ)から、グラフやデータ可視化系、チャットなど様々な種類がある  
基本データサイエンス系で使えそうなのが揃っているイメージ  

### データサイエンスとの相性
Pandas,Pyspark,Numpyなどと相性がいい  
`st.table`や`st.dataframe`のコンポーネントでデータの編集/表示が直感的にできる

Matplotlib, Plotly, GraphVizなどと相性がいい  
グラフや図の表示が比較的容易にできる  

またStreamlitのコミュニティーによってNLUなど使えたり、アノテーションテキストを表示できたりもできる  

### リアルタイム更新
あらかじめプレースホルダー(`st.empty()`)で領域のみ確保し動的に更新することで、グラフのリアルタイム更新などができる  

### デザインの自由度
コンポーネントがあらかじめ指定できるようにしたものは修正変更できるが、それ以外だと非常に限定的  
基本色やサイズを変えたりできるくらいのイメージ  

一応`st.html`や`st.markdown`でアプリにhtmlを埋め込むことはできる  
けど、iframe化されていないのでjavascriptの実行はできない  

### 多用途性
主にデータサイエンス系のWebアプリになる  
その他の用途でwebアプリを作成するとなると結構苦労するので結局Reactで書いたほうが早くね?とういう状態になる  

### デプロイ環境
- 公式紹介
  - Streamlit Community Cloud
  - [Snowflake](https://docs.snowflake.com/developer-guide/streamlit/about-streamlit)
    - 使ったことないけど、Snowsight(SnowflakeのGUI画面)上でStreamlitのアプリ開発と実行ができるらしい
- 主要クラウドの場合
  - AWS
    - Elastic Beanstalk または ECS (Fargate) 
  - GCP
    - App Engine または Cloud Run 
  - Azure
    - Azure App Service または Azure Container Instances  

などなど

### パフォーマンス
Streamlitでは何かイベントが発生するたびにスクリプト全体が再実行され、処理によっては結構遅延が発生する  
原因は、内部で状態管理とかできないので、最新の状態を保つために毎回再実行が走る  
これによってスムーズに動作しない場合があり若干煩わしい。。。

[参考](https://zenn.dev/canard0328/articles/streamlit_how_to_use)

## Flet
[Github](https://github.com/flet-dev/flet)
### 使いやすさ

UIはFlutterで構築されている  
こちらも[様々なコンポーネント](https://flet.dev/docs/controls)が用意されているため、マテリアルデザインを採用しているためそれらを使うだけでもよりモダンで本格的なアプリが作成できる    

streamlitはデータ扱う系のコンポーネントが多いのに対して、Fletは汎用的なアプリ作成に必要なコンポーネントが多い

コンポーネントのデモ画面([URL](https://flet-controls-gallery.fly.dev/layout))

matplotlib, plotlyなども使える([URL](https://flet.dev/docs/controls/charts  ))  

streamlitほどではないが、データテーブルの表示も可能([URL](https://flet.dev/docs/controls/datatable))  

### データサイエンスとの相性

まだまだ発展途上という感じはあるが、現状でもある程度問題なく使えそう  
streamlitと比べて、データの編集/表示はやや劣り、グラフや図の表示は同じくらい  

### リアルタイム更新
なし  
もしグラフやテーブルデータの現在のデータを取得したい場合は更新ボタンを作成しイベントで再度データ取得する必要がある。  

### デザインの自由度
streamlitと同様にコンポーネントがあらかじめ指定できるようにされているものは修正できる  
materialUIみたいな感じでsxでスタイル変えたりとかはできないけど、
大体ここ変えたいだろうみたいなものはプロパティで結構用意されている

ただ、streamlitよりデザインに幅がある  
(基本的なデザインの修正だけではなく、状態管理やクリックやタップした時のイベントの設定、[アニメーション](https://flet.dev/docs/cookbook/animations)などもある)

[Flet外部パッケージ](https://flet.dev/docs/extend/integrating-existing-flutter-packages)として既存のflutterパッケージを使用できるらしい  

### 多用途性
データサイエンス系以外にも様々なアプリを作成できる  
また、Webだけではなくデスクトップ,IOS,Androidにも対応している     

### デプロイ環境
- 公式紹介
  - [Cloudflare](https://flet.dev/docs/publish/web/static-website/hosting/cloudflare)
  - [Fly.io](https://flet.dev/docs/publish/web/dynamic-website/hosting/fly-io)
- 主要クラウドの場合
  - AWS
    - Elastic Beanstalk または ECS (Fargate) 
  - GCP
    - App Engine または Cloud Run 
  - Azure
    - Azure App Service または Azure Container Instances

などなど

### パフォーマンス
Fletは、[状態管理](https://flet.dev/docs/cookbook/control-refs/#ref-class)を記述できるので不要な再レンダリングをなくせる  

### 補足
FletでIOSの動作確認をiphoneで行う手順非常に簡単で新しい！
1. app storeで[Fletのアプリ](https://apps.apple.com/us/app/flet/id1624979699)をインストールする
2. `flet build ipa`を実行
3. QRコードが生成されるのでインストールしたFletのアプリで読み込む
4. 自分で作成したアプリの動作確認ができる