普段、Flutterを業務等で使っていく中で状態管理をする必要が出てくると思います。状態管理をする上で最近では、Riverpodやflutter_hooks、StateNotifier、freezedを使うことが多いのではないでしょうか。
私自身、状態管理をするために普段何となく使っているパッケージでも意外と人に説明しようとした時にどう説明すれば良いのか分からずに詰まってしまうと言う経験をしました。
そこで今回の記事では、なんとなく使っているけどブラックボックス化(理解をあやふやに)してしまっているパッケージについて調べたことをまとめていきます。
※状態とは、アプリのUIを構築するデータのことを言います。
まずはhooks_riverpodとよく使われるflutter_hooksについて紹介します。
flutter_hooksの特徴は以下の点です。
flutter_hooksはUIの状態管理をサポートするライブラリこのようにflutter_hooksはグローバルではなく、特定のページでのみ使うStateの管理によく使われます。そのため、使うページのbuild内でStateを定義することによってState情報へのアクセスがグローバルで定義したStateよりもアクセスがしやすくなります。
flutter_hooksを使うにあたって、use〇〇〇を使います。
それぞれに適した使用場面があるので、それをまとめたものを表にしました。

次は、Providerの上位互換や良い所取りをしたパッケージと言われているRiverpodについて紹介していきます。
Riverpodの特徴は以下の点です。
autoDiposeで自動で破棄できるこのようにRiverpodを使うことによって、Stateをグローバルに定義することができるため大規模なアプリでも容易にStateを渡すことができるようになります。
Riverpodを使うにあたって、使うライブラリの選択肢はいくつかあります。その選択肢の決め方は以下のようにする説明をよく見かけるので、紹介します。

flutter_riverpod:FlutterでRiverpodを使うための基本機能が提供されるhooks_riverpod:flutter_hooksとRiverpodの両方を使用する想定で作られているriverpod:Dartパッケージ(Dartのみで動くため、Flutterに対応していない)※個人的には、hooks_riverpodをよく使っております。
次に紹介するのはStateNotifierについてです。StateNotifierは主にStateを一つしか持つことができないため、複数のStateを管理したい場合は、オブジェクトを作成して管理することになります。そのため、freezedとよく使われるパッケージです。
StateNotifierの特徴は以下の点です。
ValueNotifierの拡張版のようなクラスRiverpodとfreezedと合わせてよく使うStateNotifierクラス:状態管理クラスが継承するクラスStateNotifierProviderクラス:状態管理クラスを注入するクラスStateNotifierについて自分なりにまとめてみたのが以下の図です。

最後はConsumerについて紹介していきます。
Consumerの特徴は以下の点です。
ref.watch()で状態の値の変更を監視し、変更に応じてWidgetを再描画するref.watch()を定義してしまうと状態が変化するたびにWidgetが丸ごと再描画されてしまうこのように、Consumerを使うことによって再描画される範囲を限定することができるため、再描画する必要のないところのbuildを抑制することができ、アプリのパフォーマンス向上にもつなげることができます。
いかがだったでしょうか?
普段何気なく使っているパッケージでも、意外と理解があやふやだった部分もあるのではないでしょうか?
この記事を書くことを通して、自分自身のパッケージに関する理解を深めることができたので、誰かのお役に立てればと思っております。
自分自身エンジニアとしてはまだまだ未熟なので、今回の記事で間違っている部分や知見などがございましたらTwitterのDMでコメントして頂けるとありがたいです。
[flutter_hooks]
[Riverpod]
[StateNotifier]
[Consumer]
可茂IT塾ではFlutter/Reactのインターンを募集しています!可茂IT塾のエンジニアの判断で、一定以上のスキルをを習得した方には有給でのインターンも受け入れています。
Read More可茂IT塾ではFlutter/Reactのインターンを募集しています!可茂IT塾のエンジニアの判断で、一定以上のスキルをを習得した方には有給でのインターンも受け入れています。
Read More