Provider의 변경사항을 listen 합니다. ProviderObserver를 상속받는 Class를 만들어서 ProviderScope 생성시 observers(ProviderObserver 여러개 사용 가능)에 넘겨주면 됩니다. Class 선언 시 아래 3개의 함수를 override 할 수 있습니다.
아래는 Riverpod 공홈에 있는 예제입니다.
class Logger extends ProviderObserver {
@override
void didUpdateProvider(
ProviderBase provider,
Object? previousValue,
Object? newValue,
ProviderContainer container)
{
debugPrint('''
{
"provider": "${provider.name ?? provider.runtimeType}",
"newValue": "$newValue",
"container:" "$container"
}
''');
}
@override
void didAddProvider(
ProviderBase provider,
Object? value,
ProviderContainer container)
{
debugPrint('''
{
"provider:" "${provider.name ?? provider.runtimeType}",
"value": "$value"
}
''');
}
}
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({Key? key}) : super(key: key);
@override
Widget build(BuildContext context) {
return MaterialApp(home: Home());
}
}
final counterProvider = StateProvider((ref) => 0, name: 'counter');
class Home extends ConsumerWidget {
@override
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),
),
);
}
}