목차
반응형
ProviderObserver는 ProviderContainer 내에서 발생하는 변화를 모니터링합니다.
ProviderObserver
를 상속하는 클래스를 작성하고, 메소드를 오버라이드(override)하여 사용합니다.
ProviderObserver에는 3개의 메소드가 있습니다.
didAddProvider
: 프로바이더가 초기화될 때마다 호출됩니다. 노출되는 값은value
입니다.didDisposeProvider
: 프로바이더가disposed
될 때마다 호출됩니다.didUpdateProvider
: 프로바이더가 알림을 전송할 때마다 호출됩니다.
사용법:
ProviderObserver는 didUpdateProvider
를 오버라이딩 하여 프로바이더들(providers)의 변화를 로깅할 수 있습니다.
// Logger가 있는 Riverpod로 구현한 카운터 앱 예제
class Logger extends ProviderObserver {
@override
void didUpdateProvider(
ProviderBase<Object?> provider,
Object? previousValue,
Object? newValue,
ProviderContainer container,
) {
print('''
{
"provider": "${provider.name ?? provider.runtimeType}",
"newValue": "$newValue"
}''');
}
}
void main() {
runApp(
// ProviderScope를 추가하면 Riverpod가 활성화됩니다.
// Logger 인스턴스를 observers 목록에 추가합니다.
ProviderScope(observers: [Logger()], child: const MyApp()),
);
}
class MyApp extends StatelessWidget {
const MyApp({super.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),
),
);
}
}
이제 프로바이더의 상태 값이 변경될때 마다 Logger가 로그를 출력합니다.
I/flutter (16783): {
I/flutter (16783): "provider": "counter",
I/flutter (16783): "newValue": "1"
I/flutter (16783): }
[!info] 정보
StateController(StateProvider.state의 상태) 및 ChangeNotifier와 같이 변경 가능한 상태의 경우(mutable)에는 이전 값(previousValue)과 새 값(newValue)은 동일합니다. 각각 동일한StateController
/ChangeNotifier
를 참조하기 때문입니다.
or
반응형
'개발 > 플러터(Flutter)' 카테고리의 다른 글
(Flutter) Riverpod 상태 불변성(Immutability) (0) | 2023.03.30 |
---|---|
(Flutter) Riverpod의 Provider Lifecycles (0) | 2023.03.29 |
(Flutter) Riverpod의 Modifiers (0) | 2023.03.28 |
(Flutter) Riverpod의 Provider 상태 결합하기 (0) | 2023.03.27 |
(Flutter) Riverpod의 Provider 사용 방법 (0) | 2023.03.26 |