Riverpod Lifecycle 1

koonlx·2025년 6월 12일

riverpod

목록 보기
2/4
post-thumbnail

Provider는 언제 생성되고 dispose(해제)되는가?

전체 생명주기 상태

Provider는 다음과 같은 상태를 가질 수 있음:

  • Uninitialized (초기화되지 않음)
  • Alive (활성)
  • Paused (일시중지됨)
  • Disposed (해제됨)
  • Disposed / Uninitialized (해제된 초기 상태)

상태 해석:
Uninitialized/Disposed 상태에서는 실제 상태 인스턴스는 메모리에 존재하지 않음.

→ Provider는 "어떻게 상태를 만들 것인가에 대한 정의"만 존재 → 메모리는 차지하지 않음.
상태가 Alive 상태가 되면 → Provider의 상태가 실제로 메모리에 올라가고 사용할 준비가 됨.

1. Creating → Alive

Uninitialized 상태의 Provider가 read/watch/listen 될 때 → Alive로 전이됨
이때 Provider의 build 함수가 실행됨 → 상태가 생성됨.
내부에서 ref.watch/ref.read 등을 호출하면 의존하는 다른 Provider들도 필요 시 생성됨.
만약 순환 참조(circular dependency)가 발생하면 → 에러 발생 → uni-directional(단방향) 데이터 흐름으로 설계 필요.
Provider의 상태는 ProviderContainer에 저장됨.
→ Flutter에서는 기본적으로 ProviderScope 위젯이 Container를 포함함.

  • 핵심 특징: Provider는 정의는 전역적이지만, 상태는 ProviderScope마다 독립적으로 가질 수 있음 → Scope 별로 다른 상태 가능.
    Alive 상태

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가 이미 클래스 내부에 포함됨)

2. Alive → Paused

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()로 리소스 정리.

✅ 핵심 정리

상태 의미

  • Uninitialized : 상태 미생성 → 메모리 사용 X
  • Alive : 상태 생성됨 → reactive update 적용 중
  • Paused : UI/Provider에서 참조 끊김 → 상태 유지, reactive X
  • Disposed : 상태 해제 → 메모리 사용 X

Provider 기본 (autoDispose X) → Paused로 전환됨 → 메모리 유지됨.
AutoDisposeProvider → 바로 Disposed로 전환됨 → 메모리 해제됨.

⭐ 최종 핵심 문장

"Provider는 기본적으로 Paused 상태로 최적화되고, autoDispose 적용 시 Disposed 상태로 메모리까지 해제된다. 상태는 ProviderScope 단위로 관리되며, Provider의 정의는 전역적이지만 상태는 로컬 Scope에 종속된다."

profile
Server Developer

0개의 댓글