Skip to main content

ProviderObserver

ProviderObserver は、ProviderContainer の変更を Listen します。

これを使用するには、ProviderObserverクラスを拡張し、使用したいメソッドをオーバーライドします。

ProviderObserver には4つのメソッドがあります。

  • didAddProvider は、プロバイダが初期化されるたびに呼び出され、valueとして値が公開されます。
  • didDisposeProvider はプロバイダが廃棄されるたびに呼び出されます。
  • didUpdateProvider は、プロバイダが通知を発するたびに呼び出されます。
  • mayHaveChanged は、プロバイダの依存関係が変更されたが、計算された値が変更されたかどうかはまだわからない場合に呼び出されます。
info

didUpdateProvider が呼ばれなくても、mayHaveChanged が呼ばれる可能性があります。例えば、Provider が再計算されたが、前の Provider と同じ値を返す場合などです。

Usage :#

使い方

ProviderObserver の簡単な使用例は、didUpdateProviderメソッドをオーバーライドすることで、プロバイダの変更をログ出力することです。

// riverpodで実装したLoggerを使ったカウンターの例
class Logger extends ProviderObserver {
@override
void didUpdateProvider(ProviderBase provider, Object? newValue) {
print('''
{
"provider": "${provider.name ?? provider.runtimeType}",
"newValue": "$newValue"
}''');
}
}
void main() {
runApp(
// ProviderScopeを追加すると、プロジェクト全体でRiverpodが有効になる
// オブザーバーのリストにLoggerを追加する
ProviderScope(observers: [Logger()], child: MyApp()),
);
}
class MyApp extends StatelessWidget {
const MyApp({Key? key}) : super(key: key);
@override
Widget build(BuildContext context) {
return MaterialApp(home: Home());
}
}
final counterProvider = StateProvider((ref) => 0);
class Home extends StatelessWidget {
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(title: const Text('Counter example')),
body: Center(
child: Consumer(builder: (context, ref, _) {
final count = ref.watch(counterProvider).state;
return Text('$count');
}),
),
floatingActionButton: FloatingActionButton(
onPressed: () => context.read(counterProvider).state++,
child: const Icon(Icons.add),
),
);
}
}

これで、プロバイダの値が更新されるたびに、ログ出力されるようになりました。

I/flutter (16783): {
I/flutter (16783): "provider": "counter",
I/flutter (16783): "newValue": "Instance of 'StateController<int>'"
I/flutter (16783): }