riverpod-providers について
riverpod-providersは、DartおよびFlutterでRiverpodを使う開発者向けのスキルガイドです。プロバイダーの種類、手動とコード生成による宣言、状態の読み取りや更新方法を説明します。
主な機能
- 01戻り値と可変性に応じたプロバイダー選択
- 02手動宣言とコード生成
- 03Notifierクラスによる状態変更
- 04Flutterでのプロバイダーの読み取りと監視
- 05Dartコンテナによるプロバイダー管理
活用シーン
- 01取得データに使うプロバイダーの選択
- 02複数のwidgetで計算値を共有
- 03Notifierを通じたUI状態の更新
- 04Flutter以外でのRiverpod利用
インストール
コマンドをコピーしてターミナルで実行します。
npx skills add https:/ / github.com/ serverpod/ skills-registry --skill riverpod-providersインストール後、Claude Code で/riverpod-providersを入力して読み込まれたか確認します。
同梱ファイルreference.md
詳細
Riverpod — プロバイダー
手順
プロバイダーはRiverpodの中心的な機能です。結果をキャッシュし、複数のウィジェット(または他のプロバイダー)が同じ値にアクセスできる、メモ化された関数です。トップレベルのfinal変数として宣言します。状態はプロバイダー自体ではなく、ProviderContainer(FlutterではProviderScope)に保持されます。
プロバイダーの種類
| 同期 | Future | Stream | |
|---|---|---|---|
| 変更不可 | Provider | FutureProvider | StreamProvider |
| 変更可能 | NotifierProvider | AsyncNotifierProvider | StreamNotifierProvider |
- 同期・Future・Stream:関数の戻り値の型(
int、Future<T>、Stream<T>)に合わせます。 - 変更不可:ウィジェットは値の読み取りのみを行います。計算済みデータや取得したデータに使用します。
- 変更可能:
build()メソッドとカスタムメソッドを持つNotifierを公開します。ウィジェットからref.read(provider.notifier).someMethod()を呼び出します。UIで状態を更新する必要がある場合に使用します。
返したい値に基づいて型を選ぶと、プロバイダーの種類は自然に決まります。FutureProvider/AsyncNotifierProviderが最もよく使われます。
プロバイダーの作成(変更不可/関数型)
手動:
final userProvider = FutureProvider<User>((ref) async {
final response = await http.get('https://api.example.com/user/123');
return User.fromJson(response.body);
});
**コード生成:**トップレベル関数に@riverpodを付けます。最初のパラメーターはRef refである必要があります。生成されるプロバイダー名はfunctionNameProviderです。
@riverpod
Future<User> user(Ref ref) async {
final response = await http.get('https://api.example.com/user/123');
return User.fromJson(response.body);
}
修飾子:.autoDispose(無効にするには@Riverpod(keepAlive: true))と、パラメーターを受け取る.familyがあります。riverpod-auto-disposeとriverpod-familyを参照してください。
プロバイダーの作成(変更可能/Notifier)
手動: Notifierクラスを使ってNotifierProvider(またはAsyncNotifierProvider/StreamNotifierProvider)を使用します。このクラスはNotifier<T>、AsyncNotifier<T>、またはStreamNotifier<T>を継承します。build()をオーバーライドします。コンストラクターにロジックを記述しないでください(この時点ではref/stateを使用できません)。パブリックメソッドはref.read(provider.notifier).method()で呼び出します。
final counterProvider = NotifierProvider<CounterNotifier, int>(CounterNotifier.new);
class CounterNotifier extends Notifier<int> {
@override
int build() => 0;
void increment() => state++;
}
コード生成: _$ClassNameを継承するクラスにアノテーションを付けます。build()をオーバーライドし、カスタムメソッドを追加します。同じルールが適用されます。コンストラクターにロジックを記述しないでください。
@riverpod
class CounterNotifier extends _$CounterNotifier {
@override
int build() => 0;
void increment() => state++;
}
プロバイダーの使用
- Flutter: アプリを
ProviderScopeでラップします。Consumer、ConsumerWidget、またはConsumerStatefulWidgetを使ってrefを取得し、ref.watch(provider)またはref.read(provider)を呼び出します。 - Dartのみ:
ProviderContainer()を作成し、container.read(provider)またはcontainer.listen(...)を呼び出します。使用後はcontainer.dispose()を呼び出します。 - 別のプロバイダー内: プロバイダー関数に渡された
Ref(またはNotifier内のthis.ref)を使って、他のプロバイダーに対してref.watch/ref.readを呼び出します。
ウィジェットでの例:
return Consumer(
builder: (context, ref, _) {
final helloWorld = ref.watch(helloWorldProvider);
return Text(helloWorld);
},
);
同じ型を返すプロバイダーを複数宣言できます。それぞれは独立しています。Ref、コンテナー、修飾子、Notifierのルールについて詳しくは、reference.mdを参照してください。