mcpField
R
riverpod-eager-initialization

riverpod-eager-initialization

github.com/serverpod開発1074 回インストール34 週間前に更新
リポジトリ

riverpod-eager-initialization について

riverpod-eager-initializationは、ProviderScopeの下でRiverpodのプロバイダーを監視し、Flutterアプリで早期初期化する方法を説明するスキルです。アプリツリーの不要な再構築を抑え、非同期処理の読み込みやエラーにも対応します。

主な機能

  1. 01アプリのルートでプロバイダーを監視
  2. 02アプリツリーをchildとして維持
  3. 03非同期の読み込みとエラーに対応
  4. 04テストで初期化設定を再利用

活用シーン

  1. 01アプリ起動時に指定プロバイダーを初期化
  2. 02非同期プロバイダーの準備状態を表示
  3. 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)に配置し、そのウィジェットを使うことで、テストでも同じセットアップを再利用できるようにします。

コメント