- [[Flutter]], Dart の状態管理ライブラリ ## Provider - プロバイダはあるステート(状態)をラップするためのオブジェクト - プロバイダが必要な理由 - アプリの様々な場所からステートにアクセスできるようになる - ステートを別のプロバイダのステートと簡単に組み合わせることができるようになる - アプリのパフォーマンスを最適化してくれる - アプリのテスト容易性を高めてくれる - ロギングやプルリフレッシュ(画面を引っ張って更新)などの高度な機能との組み合わせが容易に実現できる ### Provider の種類 - [Provider](https://riverpod.dev/ja/docs/providers/provider) - [StateProvider](https://riverpod.dev/ja/docs/providers/state_provider) - [FutureProvider](https://riverpod.dev/ja/docs/providers/future_provider) - [StreamProvider](https://riverpod.dev/ja/docs/providers/stream_provider) - [StateNotifierProvider](https://riverpod.dev/ja/docs/providers/state_notifier_provider) - [ChangeNotifierProvider](https://pub.dev/documentation/flutter_riverpod/latest/flutter_riverpod/ChangeNotifierProvider-class.html) - 基本的には使わない ### `ref` オブジェクトの使い方 - `ref.watch` - プロバイダを監視し値の変化に応じてウィジェットやプロバイダを更新する - `ref.listen` - 値の変化に応じて任意の関数を呼び出す - エラー発生時のスナックバー表示など、何かしらの変化に反応して処理を実行したいときに便利 - `ref.read` - プロバイダのその時点でのステートを取得することができる - ユーザ操作によって呼び出される関数内で使用するのが一般的 - `ref.read` は build メソッドの中で使わない ### プロバイダ修飾子 - `.family` - 目的 = 外部のパラメータをもとに一意のプロバイダを作成すること - `.family` 修飾子を付けてプロバイダを作成するとパラメータが追加される - `.autoDispose`  - `.autoDispose` 修飾子をつけるとプロバイダが参照されなくなった時にステートが自動的に破棄されるようになる - `.autoDispose` 修飾子を付けると、`ref` オブジェクトに `keepAlive` メソッドが追加される - `keepAlive` メソッドを実行することで、プロバイダが参照されなくなった際にもステートを維持するよう Riverpod に伝えることができる - `.autoDispose` 修飾子と [FutureProvider](https://riverpod.dev/ja/docs/providers/future_provider)、そして `ref.onDispose` を組み合わせて、 プロバイダが参照されなくなったタイミング(プロバイダのステートを監視するオブジェクトがなくなったタイミング)で HTTP リクエストをキャンセルすることができる ### ProviderObserver - [ProviderObserver](https://pub.dev/documentation/riverpod/latest/riverpod/ProviderObserver-class.html) は ProviderContainer 内で起こる変化を監視する - ProviderObserver が持つ3つのメソッド - `didAddProvider` - `didDisposeProvider` - `didUpdateProvider` - 使い方 - `didUpdateProvider` メソッドをオーバーライドしてプロバイダのステート変化をログに残す ## 便利ツール - VS Code で開発する場合に便利な拡張機能 - [Flutter Riverpod Snippets](https://marketplace.visualstudio.com/items?itemName=robert-brunhage.flutter-riverpod-snippets) ## 参考リンク - [公式サイト](https://riverpod.dev/ja/) - 参考実装 - [todoアプリ](https://github.com/rrousselGit/riverpod/tree/master/examples/todos)