(Flutter) Riverpod의 ProviderObserver

반응형

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

[카카오페이로 후원하기] [토스페이로 후원하기]

반응형