riverpod-auto-dispose について
Dart開発者向けに、Riverpodの自動破棄とProviderのライフサイクル管理を解説するスキルです。設定、クリーンアップ用コールバック、無効化、状態の保持、時間指定キャッシュの実装を扱います。
主な機能
- 01自動破棄の有効化と無効化
- 02キャンセル・破棄コールバックの処理
- 03Providerの状態を無効化
- 04選択した状態を保持
- 05タイマーを使った時間指定キャッシュ
活用シーン
- 01Providerのリスナーがなくなった際にリソースを解放
- 02familyの各パラメーターの状態を保持し続けないようにする
- 03成功結果を保持しつつ未使用または失敗した状態を破棄
インストール
コマンドをコピーしてターミナルで実行します。
npx skills add https:/ / github.com/ serverpod/ skills-registry --skill riverpod-auto-disposeインストール後、Claude Code で/riverpod-auto-disposeを入力して読み込まれたか確認します。
詳細
Riverpod — 自動破棄
手順
自動破棄を有効にすると、1 フレームの間リスナーがいないプロバイダーの状態が Riverpod によって破棄されます。これによりメモリが解放され、プロバイダーが使われなくなったときに処理(ネットワークリクエストなど)が停止します。
有効化
- コード生成: デフォルトで有効です。
@Riverpod(keepAlive: true)で無効にできます。 - 手動: プロバイダーの作成時に
isAutoDispose: trueを追加します(例:Provider.autoDispose(...)またはFutureProvider.autoDispose(...))。
// Codegen: disable auto-dispose
@Riverpod(keepAlive: true)
String helloWorld(Ref ref) => 'Hello world!';
// Manual: enable
final helloWorldProvider = Provider<String>(
isAutoDispose: true,
(ref) => 'Hello world!',
);
プロバイダーにパラメーター(ファミリー)がある場合は、自動破棄を有効にして、すべてのパラメーターの組み合わせが永久にキャッシュされてメモリリークを引き起こすのを防ぎます。
破棄が実行されるタイミング
Riverpod はリスナー(ref.watch、ref.listen など)の数をカウントします。数がゼロになると、1 フレーム待機します。その後もゼロのままであれば、ref.onCancelが実行され、続いて状態が破棄されてref.onDisposeが実行されます。
破棄への対応:ref.onDispose
状態が破棄されるときに実行するコールバックを登録します(例:StreamController を閉じる)。
final provider = StreamProvider<int>((ref) {
final controller = StreamController<int>();
ref.onDispose(controller.close);
return controller.stream;
});
onDispose の中で、ほかのプロバイダーを変更する副作用を実行しないでください。onDispose は複数回呼び出すことができます。ほかのライフサイクルとして、ref.onCancel(最後のリスナーが削除されたとき)とref.onResume(キャンセル後に新しいリスナーが追加されたとき)があります。
強制的な破棄:ref.invalidate
ウィジェットまたは別のプロバイダーから**ref.invalidate(provider)**を呼び出すと、現在の状態を破棄できます。プロバイダーが引き続きリッスンされている場合は再計算され、そうでない場合は再度読み取られるまで破棄されたままになります。
onPressed: () => ref.invalidate(someProvider),
ファミリープロバイダーでは、特定のパラメーターの組み合わせ、またはすべての組み合わせを無効化できます(riverpod-family とドキュメントを参照)。
状態を保持する:ref.keepAlive
自動破棄が有効な場合、**ref.keepAlive()**を呼び出すと、次回の再計算まで破棄を防げます。成功した結果を保持しつつ、失敗した状態や使われていない状態は破棄できるようにする場合に使います。戻り値を呼び出すと、自動破棄に戻せます。プロバイダーが再計算されると、自動破棄が再度有効になります。
一定期間キャッシュする
Riverpod には、「X 秒間キャッシュする」機能は組み込まれていません。Timer と ref.keepAlive を使って実装するか、ref.onCancel/ref.onResume を使って、リスナーがいない状態が一定期間続いた後に破棄できます。