Zum Hauptinhalt springen

ProviderObserver

ProviderObserver lauscht auf die Änderungen eines ProviderContainer.

Um es zu nutzen, extende die Klasse ProviderObserver und überschreibe die Methoden, die du benutzen möchtest.

ProviderObserver hat drei Methoden :

  • didAddProvider wird jedes Mal aufgerufen, wenn ein Provider initialisiert wurde, und der angezeigte Wert ist Wert.
  • didDisposeProvider wird jedes Mal aufgerufen, wenn ein Provider entsorgt/gelöscht wurde.
  • didUpdateProvider wird jedes Mal vom Provider aufgerufen, wenn eine Notification ausgesendet wird.

Verwendung:

Ein einfacher Anwendungsfall für ProviderObserver ist es, die Änderungen in Providern zu protokollieren, indem man die Methode didUpdateProvider überschreibt.


// A Counter example implemented with riverpod with Logger

class Logger extends ProviderObserver {

void didUpdateProvider(
ProviderBase<Object?> provider,
Object? previousValue,
Object? newValue,
ProviderContainer container,
) {
print('''
{
"provider": "${provider.name ?? provider.runtimeType}",
"newValue": "$newValue"
}''');
}
}

void main() {
runApp(
// Adding ProviderScope enables Riverpod for the entire project
// Adding our Logger to the list of observers
ProviderScope(observers: [Logger()], child: const MyApp()),
);
}

class MyApp extends StatelessWidget {
const MyApp({super.key});


Widget build(BuildContext context) {
return MaterialApp(home: Home());
}
}

final counterProvider = StateProvider((ref) => 0, name: 'counter');

class Home extends ConsumerWidget {

Widget build(BuildContext context, WidgetRef ref) {
final count = ref.watch(counterProvider);

return Scaffold(
appBar: AppBar(title: const Text('Counter example')),
body: Center(
child: Text('$count'),
),
floatingActionButton: FloatingActionButton(
onPressed: () => ref.read(counterProvider.notifier).state++,
child: const Icon(Icons.add),
),
);
}
}

Nun wird jedes Mal, wenn der Wert unseres Providers aktualisiert wird, der Logger dies protokollieren:

I/flutter (16783): {
I/flutter (16783): "provider": "counter",
I/flutter (16783): "newValue": "1"
I/flutter (16783): }