🧶

【Flutter】状態管理(Provider, Bloc, Riverpod, etc..)について考える💭

2023/08/14に公開

更新履歴

2023/09/12 RiverpodがFlutterFavoriteに追加された🎉

📖 はじめに

普段はRiverpodを用いてFlutterアプリ開発をしてますが、
「Riverpodが流行りっぽい」くらいの理解しか持ててなかったです。

他の状態管理手法について気になったので記事にしてみました。

🔖 前置き

  • ボイラープレートコードを減らし扱いやすく出来るパッケージがFlutterには豊富にあるため、本記事ではパッケージを用いた状態管理を紹介します。
  • 詳細な実装方法等には触れないです。
  • 「Flutterの状態管理って色々あるけど、どれがいいの?」の参考になれば幸いです。

👍 パッケージのLIKE数からみる人気の状態管理手法

Flutter公式ドキュメントをみると、多くの状態管理手法があることを知りました。
この記事では以下の観点で主要な状態管理手法を表にまとめました。

  • Flutter公式ドキュメントに記載がある。
  • pub.devでのLIKE数が1Kを超えている。
  • 1年以内にアップデートされている。
  • 「setState」や「InheritedWidget」などの、パッケージを必要としない状態管理は除く。

また参考情報として、「FlutterFavorite」の有無を表に載せています。

FlutterFavoriteとは?

Flutter Favorite program

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

以下の記事が大変参考になりました!
https://qiita.com/kabochapo/items/fcdbd6f7bcf69a91df83

正直あまり聞き馴染みがなく今回初めて調べることになりました。
実際に使用していないため所感ですが、「ミニマリズムな状態管理手法」なイメージです!

  • シンプルなダイレクト「サービスロケータ」
  • どこからでも参照可能
  • リポジトリなどのインスタンスを生成して取り出すだけ?

合わせて議論されることが多そうな、「DIコンテナ」についての理解も合わせて行うのがハードル高そうだなぁと思いました。
かなり気になってるので今後使ってみようと思います。

3.Riverpod

Riverpodは日本ではかなり人気で、多くの記事があるので簡単な紹介だけになります!

  • Providerと同じ、Remiさんが開発している
  • Providerでは不可能な改善を行うためのプロバイダ
  • Hooksなど便利な機能もある
  • まだ発展途上でバグもちらほらとあるイメージ

4.Bloc

詳しくは公式ドキュメントで
https://bloclibrary.dev/#/gettingstarted

  • BLoCデザイン・パターンを実現するための状態管理パッケージ
  • Provierに依存している
  • flutter_bloc、angular_blocと、アプリとwebでパッケージが分けられてる(気になる)

Riverpodが小・中規模な開発に向いているのに対し、Blocは大規模な開発に向いている印象です。

Riverpodは比較的直感的かつ柔軟に状態管理を行えますが、その分クラスの役割がやや曖昧になりがちだなと感じています。

BlocはビジネスロジックとUIを分けることを目的としたデザインパターンなので、Riverpodでは曖昧になりがちな部分が正されそうです。
その分Riverpodでは不要だった冗長なコードも増えることも考えられます。

5.Rxdart

RxdartもBLoCパターンを実現するものなので、Blocでいいのでは?と感じました。

📗 おわりに

実際に使用してみて良し悪しを知ることは大切ですが、学習コストも少なからずかるので、
サクッと調べてどれが適していそうか考えることも出来そうだなと思いました。

進化の早い技術なので、乗り遅れないようにキャッチアップ続けていきます。

Discussion