Provider는 다음과 같은 상태를 가질 수 있음:
상태 해석:
Uninitialized/Disposed 상태에서는 실제 상태 인스턴스는 메모리에 존재하지 않음.
→ Provider는 "어떻게 상태를 만들 것인가에 대한 정의"만 존재 → 메모리는 차지하지 않음.
상태가 Alive 상태가 되면 → Provider의 상태가 실제로 메모리에 올라가고 사용할 준비가 됨.
Uninitialized 상태의 Provider가 read/watch/listen 될 때 → Alive로 전이됨
이때 Provider의 build 함수가 실행됨 → 상태가 생성됨.
내부에서 ref.watch/ref.read 등을 호출하면 의존하는 다른 Provider들도 필요 시 생성됨.
만약 순환 참조(circular dependency)가 발생하면 → 에러 발생 → uni-directional(단방향) 데이터 흐름으로 설계 필요.
Provider의 상태는 ProviderContainer에 저장됨.
→ Flutter에서는 기본적으로 ProviderScope 위젯이 Container를 포함함.
Alive 상태에서는 상태가 변경되면 → 해당 상태를 참조하고 있는 Provider/Widget들도 자동으로 재빌드됨.
반응형(reactive) 프레임워크 구조: 다른 Provider 상태에 의존하면 → 변화 시 자동으로 재생성 가능.
Ref API 활용:
ref.listen → 다른 Provider 변화 감지 (Provider 재생성 없이 side-effect 용으로 listen 가능)
ref.read → 현재 다른 Provider의 상태 즉시 조회 (reactive X)
StateNotifier / ChangeNotifier 기반 Provider를 만들 때 → ref를 인자로 주입하여 필요 시 다른 상태를 가져올 수 있음.
(Riverpod 2.0에서는 Notifier와 AsyncNotifier는 ref가 이미 클래스 내부에 포함됨)
Provider가 더 이상 UI에서 watch/read/listen 되지 않으면 → Paused 상태로 전환됨.
Paused 상태에서는:
reactive 업데이트 반응 X
상태 자체는 메모리에 유지 (메모리 사용 O, CPU 계산 사용 X)
최적화 목적: 사용하지 않는 Provider는 연산 리소스를 줄이기 위해 Pause 상태로 관리.
관련 API:
ref.onCancel → Pause 전환 시 실행할 콜백 등록 가능.
ref.onResume → Paused → Alive 복귀 시 실행할 콜백 등록 가능.
Alive → Disposed
다음 상황에서 Disposed 상태로 전환됨:
autoDispose modifier 적용 + 더 이상 참조되지 않음
수동으로 refresh/invalidate 수행
watch한 의존 Provider의 상태가 변경되어 재생성이 필요한 경우
Refresh: 즉시 다시 build 호출.
Invalidate: 다음 watch/read 시점에 build 호출.
ref.onDispose → Disposed 직전 실행할 콜백 등록 가능.
onDispose 활용 예제
Stream<int> example(Ref ref) {
final streamController = StreamController<int>();
ref.onDispose(() {
streamController.close();
});
return streamController.stream;
}
→ StreamController는 메모리 관리가 중요하므로 → Provider 상태가 Disposed 되기 전에 streamController.close()로 리소스 정리.
✅ 핵심 정리
상태 의미
Provider 기본 (autoDispose X) → Paused로 전환됨 → 메모리 유지됨.
AutoDisposeProvider → 바로 Disposed로 전환됨 → 메모리 해제됨.
⭐ 최종 핵심 문장
"Provider는 기본적으로 Paused 상태로 최적화되고, autoDispose 적용 시 Disposed 상태로 메모리까지 해제된다. 상태는 ProviderScope 단위로 관리되며, Provider의 정의는 전역적이지만 상태는 로컬 Scope에 종속된다."