riverpod-eager-initialization について
riverpod-eager-initializationは、ProviderScopeの下でRiverpodのプロバイダーを監視し、Flutterアプリで早期初期化する方法を説明するスキルです。アプリツリーの不要な再構築を抑え、非同期処理の読み込みやエラーにも対応します。
主な機能
- 01アプリのルートでプロバイダーを監視
- 02アプリツリーをchildとして維持
- 03非同期の読み込みとエラーに対応
- 04テストで初期化設定を再利用
活用シーン
- 01アプリ起動時に指定プロバイダーを初期化
- 02非同期プロバイダーの準備状態を表示
- 03テストでアプリの初期化設定を共有
インストール
コマンドをコピーしてターミナルで実行します。
npx skills add https:/ / github.com/ serverpod/ skills-registry --skill riverpod-eager-initializationインストール後、Claude Code で/riverpod-eager-initializationを入力して読み込まれたか確認します。
詳細
Riverpod — 先行初期化
手順
プロバイダーはデフォルトで遅延評価され、初めて使用されたときに初期化されます(ツリーシェイキングのため)。組み込みの「先行」フラグはありません。早期に初期化するには、アプリのルートでプロバイダーを監視し、プロバイダーを維持してすぐに実行されるようにします。
方法
ProviderScope の直下に、初期化したいプロバイダーだけを監視し、実際のアプリを child として返す Consumer(または ConsumerWidget)を配置します。
void main() {
runApp(ProviderScope(child: MyApp()));
}
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return const _EagerInitialization(child: MaterialApp());
}
}
class _EagerInitialization extends ConsumerWidget {
const _EagerInitialization({required this.child});
final Widget child;
@override
Widget build(BuildContext context, WidgetRef ref) {
ref.watch(myProvider); // Eagerly initialize
return child;
}
}
プロバイダーの変更時に再ビルドされるのは初期化ウィジェットだけです。child は変更されないため、ほかのウィジェットが監視していない限り、Flutter はツリーの残りの部分を再ビルドしません。
非同期処理:読み込みとエラー
プロバイダーが非同期の場合は、初期化ウィジェットで読み込みとエラーを処理します(例:準備ができるまで CircularProgressIndicator またはエラーを表示し、その後 child を返します)。ほかのウィジェットでは AsyncValue.requireValue を使うと、パターンマッチングをせずにデータを読み取れます。値の準備ができる前に実行された場合は、明確なメッセージとともに例外がスローされます。
初期化ウィジェットは共有ウィジェット(例:MyApp)に配置し、そのウィジェットを使うことで、テストでも同じセットアップを再利用できるようにします。