ProviderObserver
ProviderObserver는 애플리케이션에서 provider의 생명주기 이벤트를 관찰하는 객체입니다. 주로 로깅, 분석, 디버깅 용도로 사용합니다.
사용법
ProviderObserver를 사용하려면 클래스를 상속하고 관찰하려는 생명주기 메서드를 오버라이드해야 합니다. 사용할 수 있는 메서드가 많으니 자세한 내용은 문서를 확인하는 것이 좋습니다.
예시: 로거
다음 옵저버는 애플리케이션에 있는 모든 provider의 상태 변경을 기록합니다:
// A basic logger, which logs any state changes.
final class Logger extends ProviderObserver {
void didUpdateProvider(
ProviderObserverContext context,
Object? previousValue,
Object? newValue,
) {
print('''
{
"provider": "${context.provider}",
"newValue": "$newValue",
"mutation": "${context.mutation}"
}''');
}
}
void main() {
runApp(
ProviderScope(
// ProviderObservers are used by passing them to ProviderScope/ProviderContainer
observers: [
// Adding ProviderScope enables Riverpod for the entire project
// Adding our Logger to the list of observers
Logger(),
],
child: const MyApp(),
),
);
}
// After this, implement a typical Flutter application
이제 provider의 값이 업데이트될 때마다 로거가 이를 기록합니다:
{
"provider": "Provider<int>",
"newValue": "1"
}
디버깅을 더 편하게 하려면 provider에 이름을 붙일 수도 있습니다:
final myProvider = Provider<int>((ref) => 0, name: 'MyProvider');
이렇게 바꾸면 로그는 다음과 같이 출력됩니다:
{
"provider": "MyProvider",
"newValue": "1"
}
팁
코드 생성을 사용하면 provider에 이름이 자동으로 지정됩니다.
참고
provider의 상태를 직접 변경하면(주로 List를 Ref.notifyListeners와 함께 사용하는 경우)
didUpdateProvider가 받는 previousValue와 newValue가 같은 값일 가능성이 높습니다.
Dart가 객체를 "참조"로 업데이트하기 때문입니다. 이를 피하려면 객체를 변경하기 전에 복제해야 합니다.