riverpod-family について
Riverpod の provider が ID、検索条件、ページ番号などの引数ごとに独立した状態を持つ方法を解説するスキルです。作成、利用、自動破棄、テストでのオーバーライドを扱います。
主な機能
- 01引数ごとの独立した状態
- 02関数型と Notifier provider
- 03自動破棄の設定
- 04引数の等価性要件
- 05テストでの provider オーバーライド
活用シーン
- 01ユーザー ID ごとのデータ読み込み
- 02検索条件やページ別の API リクエスト
- 03テストでの引数付き provider のオーバーライド
インストール
コマンドをコピーしてターミナルで実行します。
npx skills add https:/ / github.com/ serverpod/ skills-registry --skill riverpod-familyインストール後、Claude Code で/riverpod-familyを入力して読み込まれたか確認します。
詳細
Riverpod — Family
手順
Family を使うと、1つのプロバイダーで複数の独立した状態を、パラメーターの組み合わせごとに持つことができます(パラメーターと状態を対応付ける Map のようなものです)。ID、クエリ、ページ番号に依存する API 呼び出しに使用します。
Family の作成(関数型)
.family と引数用の追加の型パラメーターを指定します。プロバイダー関数は (ref, param) を受け取ります。
final userProvider = FutureProvider.autoDispose.family<User, String>((ref, id) async {
final dio = Dio();
final response = await dio.get('https://api.example.com/users/$id');
return User.fromJson(response.data);
});
コード生成を使う場合は、関数にパラメーターを追加します。生成されたプロバイダーは引数を受け取ります。例:userProvider(id)。
Family の作成(Notifier)
NotifierProvider.family/AsyncNotifierProvider.family(および .autoDispose.family)を使用します。Notifier にはパラメーターを保持するコンストラクターが必要です。
final userProvider = AsyncNotifierProvider.autoDispose.family<UserNotifier, User, String>(
UserNotifier.new,
);
class UserNotifier extends AsyncNotifier<User> {
UserNotifier(this.id);
final String id;
@override
Future<User> build() async {
final dio = Dio();
final response = await dio.get('https://api.example.com/users/$id');
return User.fromJson(response.data);
}
}
Family の使用
監視または読み取りの際にパラメーターを渡します。
final user = ref.watch(userProvider('123'));
final other = ref.watch(userProvider('456')); // independent state
パラメーターの == と hashCode は一貫している必要があります。可変の値や、リスト/マップのリテラルをパラメーターとして使用しないでください(例:ref.watch(myProvider([1,2,3])) は [1,2,3] != [1,2,3] となるため誤りです)。プリミティブ型、または ==/hashCode を実装したカスタムクラスを使用してください。間違いを検出するには、riverpod_lint の provider_parameters ルールを有効にします。
Family での Auto-dispose
Family を使用する場合は auto-dispose を有効にします。パラメーターが使われなくなったとき(例:ユーザーが別の画面に移動したとき)に、そのパラメーターの状態を破棄でき、キャッシュが際限なく増えるのを防げます。
テストでのオーバーライド
- 1つのパラメーターをオーバーライドする場合:オーバーライドにも同じパラメーターを渡します。
- すべてのパラメーターをオーバーライドする場合:パラメーターを無視する、または固定値を返すプロバイダーでオーバーライドします。正確な構文については、riverpod-overrides とドキュメントを参照してください。