【Flutter】状態管理(Provider, Bloc, Riverpod, etc..)について考える💭
更新履歴
2023/09/12 RiverpodがFlutterFavoriteに追加された🎉
📖 はじめに
普段はRiverpodを用いてFlutterアプリ開発をしてますが、
「Riverpodが流行りっぽい」くらいの理解しか持ててなかったです。
他の状態管理手法について気になったので記事にしてみました。
🔖 前置き
- ボイラープレートコードを減らし扱いやすく出来るパッケージがFlutterには豊富にあるため、本記事ではパッケージを用いた状態管理を紹介します。
- 詳細な実装方法等には触れないです。
- 「Flutterの状態管理って色々あるけど、どれがいいの?」の参考になれば幸いです。
👍 パッケージのLIKE数からみる人気の状態管理手法
Flutter公式ドキュメントをみると、多くの状態管理手法があることを知りました。
この記事では以下の観点で主要な状態管理手法を表にまとめました。
- Flutter公式ドキュメントに記載がある。
- pub.devでのLIKE数が1Kを超えている。
- 1年以内にアップデートされている。
- 「setState」や「InheritedWidget」などの、パッケージを必要としない状態管理は除く。
また参考情報として、「FlutterFavorite」の有無を表に載せています。
FlutterFavoriteとは?
The aim of the Flutter Favorite program is to identify packages and plugins that you should first consider when building your app. This is not a guarantee of quality or suitability to your particular situation—you should always perform your own evaluation of packages and plugins for your project.
Flutter Favoriteプログラムの目的は、アプリを構築する際にまず検討すべきパッケージやプラグインを特定することです。これはあなたの特定の状況に対する品質や適合性を保証するものではありません。
状態管理手法 | LILE数 | 最終更新 | FlutterFavorite | pub.dev |
---|---|---|---|---|
Provider | 8.7K | 7ヶ月前 | ○ | https://pub.dev/packages/provider |
GetIt | 3.2K | 3ヶ月前 | - | https://pub.dev/packages/get_it |
Riverpod | 2.6K | 3ヶ月前 | ○ | https://pub.dev/packages/riverpod |
Bloc | 2.3K | 2ヶ月前 | ○ | https://pub.dev/packages/bloc |
Rxdart | 2.2K | 8ヶ月前 | ○ | https://pub.dev/packages/rxdart |
Riverpodが最もメジャーだと思ってたので、表の結果に驚きました。
FlutterFavoriteですらないなんて...(今更)
RiverpodがFlutterFavoriteに追加されました🎉
📚 5つの状態管理手法の特徴
具体的な実装方法など扱い方を説明しようとすると、比較が難しく長くなりそうだったので、
各パッケージのストロングポイントやバックグラウンドな部分を、個人的な理解で紹介します。
1.Provider
-
InheritedWidgetをより使いやすく、より再利用しやすくするためのラッパー
- 親のWidgetツリーを参照してProviderにアクセスできる
- Riverpodと同じ、Remiさんが開発している
- BlocはProvierに依存している
Flutter公式から紹介されている状態管理手法であり、今流行りのパッケージの原点のような状態管理手法です。
Riverpodでは「Providerでは解決できない問題を解決できる」と謳われていますが、
providerのリポジトリを見てもissueの数は少なく、成熟している状態管理手法と言えるのではないでしょうか。
比較的新しい技術であるFlutterにおいて、Providerを採用することで得られる安定感というのは大きそうです。
2.GetIt
以下の記事が大変参考になりました!
正直あまり聞き馴染みがなく今回初めて調べることになりました。
実際に使用していないため所感ですが、「ミニマリズムな状態管理手法」なイメージです!
- シンプルなダイレクト「サービスロケータ」
- どこからでも参照可能
- リポジトリなどのインスタンスを生成して取り出すだけ?
合わせて議論されることが多そうな、「DIコンテナ」についての理解も合わせて行うのがハードル高そうだなぁと思いました。
かなり気になってるので今後使ってみようと思います。
3.Riverpod
Riverpodは日本ではかなり人気で、多くの記事があるので簡単な紹介だけになります!
- Providerと同じ、Remiさんが開発している
- Providerでは不可能な改善を行うためのプロバイダ
- Hooksなど便利な機能もある
- まだ発展途上でバグもちらほらとあるイメージ
4.Bloc
詳しくは公式ドキュメントで
- BLoCデザイン・パターンを実現するための状態管理パッケージ
- Provierに依存している
- flutter_bloc、angular_blocと、アプリとwebでパッケージが分けられてる(気になる)
Riverpodが小・中規模な開発に向いているのに対し、Blocは大規模な開発に向いている印象です。
Riverpodは比較的直感的かつ柔軟に状態管理を行えますが、その分クラスの役割がやや曖昧になりがちだなと感じています。
BlocはビジネスロジックとUIを分けることを目的としたデザインパターンなので、Riverpodでは曖昧になりがちな部分が正されそうです。
その分Riverpodでは不要だった冗長なコードも増えることも考えられます。
5.Rxdart
RxdartもBLoCパターンを実現するものなので、Blocでいいのでは?と感じました。
📗 おわりに
実際に使用してみて良し悪しを知ることは大切ですが、学習コストも少なからずかるので、
サクッと調べてどれが適していそうか考えることも出来そうだなと思いました。
進化の早い技術なので、乗り遅れないようにキャッチアップ続けていきます。
Discussion