Uninitialized
|
V (watch/read/listen 시)
Alive
|
| (UI에서 참조 끊김)
+--> Paused (Provider 기본)
| |
| V (참조 복귀 시)
| Alive
|
| (AutoDispose 적용 시 참조 끊김)
+--> Disposed (메모리 해제)
해석:
기본 Provider:
참조 끊겨도 Paused 상태 → 메모리에 유지됨 → 이후 참조 복귀 시 Alive로 복귀.
AutoDisposeProvider:
참조 끊기면 바로 Disposed → 메모리 해제 → 이후 참조 시 다시 build 실행됨.
| Provider 종류 | Alive → Paused 지원 여부 | Alive → Disposed 지원 여부 | 메모리 유지 여부 |
|---|---|---|---|
| Provider | ✅ 지원 | ❌ 지원 안 함 | 유지됨 (Paused 시 유지) |
| AutoDisposeProvider | ❌ 지원 안 함 | ✅ 바로 Disposed | 유지 안 됨 |
| StateProvider | ✅ | ❌ | 유지됨 |
| StateNotifierProvider | ✅ | ❌ | 유지됨 |
| AutoDisposeStateProvider | ❌ | ✅ | 유지 안 됨 |
| AutoDisposeStateNotifierProvider | ❌ | ✅ | 유지 안 됨 |
정리:
AutoDispose 붙으면 → 참조 끊기면 바로 Disposed → 재사용 시 재생성 비용 있음 (주의 필요).
Provider 기본은 → 참조 끊겨도 Paused → 이후 빠른 복귀 가능.
final myPageViewModelProvider = AutoDisposeStateNotifierProvider<MyPageViewModel, MyPageState>((ref) {
return MyPageViewModel();
});
final myStreamProvider = AutoDisposeStreamProvider<int>((ref) {
return someHeavyStream();
});
final preferencesServiceProvider = Provider<PreferencesService>((ref) {
final prefs = ref.watch(sharedPreferencesProvider).requireValue;
return PreferencesService(prefs);
});
✅ 최종 실전 패턴 요약
| 사용 케이스 | Provider 추천 종류 |
|---|---|
| 화면 전용 ViewModel | AutoDisposeStateNotifierProvider |
| 화면 단기 상태 | AutoDisposeStateProvider |
| 전역 서비스 (router, auth, theme 등) | Provider |
| 전역 상태 공유 (user profile 등) | Provider 또는 StateNotifierProvider |
| Stream / DB 리소스 heavy Provider | AutoDisposeStreamProvider |
⭐ 핵심 정리 문장
"화면 전용 상태/리소스는 AutoDisposeProvider로 관리하고, 앱 전역 상태/서비스는 일반 Provider로 관리하라 — 이 패턴이 유지보수성과 성능을 모두 확보하는 실전 Best Practice다."