Aller au contenu principal

ProviderObserver

ProviderObserver écoute les changements d'un ProviderContainer.

Pour l'utiliser, étendez (extend) la classe ProviderObserver et surchargez (override) la méthode que vous souhaitez utiliser.

  • didAddProvider est appelé chaque fois qu'un provider a été initialisé, et la valeur exposée est value.
  • didDisposeProvider est appelé chaque fois que le provider A a été éliminé.
  • didUpdateProvider est appelé à chaque fois que mes providers émettent une notification.

Usage:

Un cas d'utilisation simple de ProviderObserver, est d'enregistrer les changements dans les providers en surchargeant (override) la méthode didUpdateProvider.


// Un exemple de compteur mis en pratique avec Riverpod avec 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(
// L'ajout de ProviderScope active Riverpod pour l'ensemble du projet.
// L'ajout de notre Logger à la liste des observateurs
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),
),
);
}
}

Maintenant, chaque fois que la valeur de notre provider est mise à jour, le logger l'enregistrera :

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