ProviderObserver
ProviderObserver ProviderContainer'da yapılan değişiklikleri dinler.
Bunu kullanmak için ProviderObserver sınıfını genişletin ve kullanmak istediğiniz yöntemi geçersiz kılın.
ProviderObserver'ın üç yöntemi vardır:
- Bir provider her başlatıldığında 'didAddProviderse' çağrılır ve açığa çıkan değer 'value' olur.
- Bir provider her atıldığında
didDisposeProvider
çağrılır. didUpdateProvider
provider'lar tarafından her bildirimde bulunulduğunda çağrılır.
Kullanım:
ProviderObserver için basit bir kullanım örneği, provider'lardaki değişiklikleri günlüğe kaydetmektir 'didUpdateProvider' yöntemini geçersiz kılma.
// Riverpod ile uygulanan bir Counter Logger örneği
class Logger extends ProviderObserver {
void didUpdateProvider(
ProviderBase provider,
Object? previousValue,
Object? newValue,
ProviderContainer container,
) {
print('''
{
"provider": "${provider.name ?? provider.runtimeType}",
"newValue": "$newValue"
}''');
}
}
void main() {
runApp(
// ProviderScope'un eklenmesi Riverpod'un tüm proje için etkinleştirilmesini sağlar
// Logger'ımızı gözlemci listesine ekliyoruz
ProviderScope(observers: [Logger()], child: MyApp()),
);
}
class MyApp extends StatelessWidget {
const MyApp({Key? key}) : super(key: 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),
),
);
}
}
Artık provider'ımızın değeri her güncellendiğinde, kaydedici bunu günlüğe kaydedecektir:
I/flutter (16783): {
I/flutter (16783): "provider": "counter",
I/flutter (16783): "newValue": "1"
I/flutter (16783): }