[flutter][riverpod] ProviderObserver

냠냠·2022년 11월 10일
0

flutter

목록 보기
1/3

Provider의 변경사항을 listen 합니다. ProviderObserver를 상속받는 Class를 만들어서 ProviderScope 생성시 observers(ProviderObserver 여러개 사용 가능)에 넘겨주면 됩니다. Class 선언 시 아래 3개의 함수를 override 할 수 있습니다.

  • didAddProvider : provider가 initialized(초기화) 될 때 마다 호출 됩니다. provider의 value를 파라미터로 받습니다.
  • didDisposeProvider : provider 가 dispose(해제) 될 때 마다 호출됩니다.
  • didUpdateProvider : provider 가 notification(알람)을 emit(방출) 할 때마다 호출됩니다. provider의 이전 value와 새로운 value를 파라미터로 받습니다.

아래는 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),
      ),
    );
  }
}

0개의 댓글