Flutterで状態管理といえば、provider
やriverpod
を使った実装が主流になりつつあります。中でもProvider
とそのバリエーションであるProvider.family
(以下、単にfamily
)の使い分けは、プロジェクトが複雑になるほど重要な選択となります。
今回は、Provider
とfamily
の違いと、それぞれをどう使い分けるべきかを実際のユースケースとともに整理してみます。
Provider
とfamily
の違いとは?Provider
単一のインスタンスを提供する、最も基本的なプロバイダ。アプリ内でその型の状態が1つだけ存在すれば十分、という場合に使います。
family
引数付きで状態を生成できる拡張バージョン。例えば、「同じロジックだけど異なるIDごとのデータを扱いたい」といった場面で重宝します。
Provider
ログインユーザー情報
アプリ全体の設定(テーマ・言語など)
サービスクラス(UseCaseやRepositoryなど)
family
ユーザーIDごとのデータ取得
ページIDやカテゴリIDごとの状態
動的に変わる依存関係があるとき
family
はキャッシュされる一度作成したfamily
のインスタンスは同じ引数で再度呼び出すとキャッシュが使われます。つまり、同じIDであれば無駄なAPIコールなどは避けられる。
family
で解決複数パラメータが絡む初期化処理や依存関係の注入が必要な場合、family
でUseCase
を生成することで責務が明確になります。
通常:xxxProvider
family:xxxProvider.family
または xxxFamilyProvider
状況 | 選ぶべきProvider |
---|---|
アプリ内に1つだけ必要な状態 | Provider |
パラメータごとに状態が変わる | Provider.family |
Viewごとに依存関係が動的に変わる | Provider.family + AutoDispose |
状態がどの単位で切り替わるべきか、どこまで使い回すべきか。この見極めがProvider
設計の核心です。
状態管理はチームの共通言語。設計の一貫性が保たれることで、可読性と保守性は確実に上がります。
もしチームで運用しているなら、「いつfamilyを使うか」をルールとして明文化しておくのもおすすめです。