Flutter에서 상태 관리는 앱의 핵심입니다.
setState()
만으로는 화면이 복잡해질수록 유지·보수가 어려워지기 때문에,더 안전하고 모듈화된 상태 관리 도구가 필요합니다.
그중 Riverpod은 Provider 패턴을 개선한 강력한 상태관리 라이브러리입니다.

1. read vs watch
Riverpod의 핵심은 Provider(창고)와 ref(열쇠)입니다.
ref
를 통해 Provider에 접근할 때 두 가지 방식이 있습니다.watch
→ 상태를 “구독”해서 값이 바뀌면 자동으로 UI를 다시 빌드
→ 주로 UI(화면)에서 사용
read
→ 상태를 “한 번만 읽기”
→ 주로 행위(메서드 호출)가 필요할 때 사용 (UI 갱신 없이 단발성 접근)
ㅤ | watch | read |
목적 | 상태 구독 & 자동 리빌드 | 상태/Notifier에 단발성 접근 |
사용 위치 | build(), ConsumerWidget | onPressed, initState, 비즈니스 로직 |
2. Riverpod 세팅
pubspec.yaml
에 추가
flutter_riverpod: ^2.6.1
main.dart
에서 앱 최상단을 ProviderScope로 감싼다.
void main() {
runApp(const ProviderScope(child: MyApp()));
}
3. 창고 만들기 (State + 행위)
Riverpod에서 창고 = ViewModel/Notifier 라고 보면 됩니다.
(1) 상태 타입이 단순할 때
단순히
int
, bool
정도라면 굳이 클래스를 만들지 않고 StateProvider
로 바로 관리할 수 있습니다.final counterProvider = StateProvider<int>((ref) => 0);
(2) 상태 + 행위가 있는 경우 (ViewModel)
상태 값과 행위를 같이 관리하고 싶을 때
Notifier
를 상속받습니다.// 창고(ViewModel)
class HomeVM extends Notifier<int> {
@override
int build() {
return 1; // 초기 상태값
}
void increase() {
state++; // setState 필요 없음
}
}
// 창고 관리자(Provider)
final homeProvider = NotifierProvider<HomeVM, int>(() {
return HomeVM();
});
📌 정리
Notifier<int>
: 창고가 관리할 상태(State)의 타입 =int
build()
: 창고가 생성될 때 초기값 설정
state
: 현재 상태값. 수정하면 자동으로 구독 중인 UI가 리빌드
4. UI에서 창고 사용하기
1) watch – 상태 구독
ConsumerWidget
또는 Consumer
를 사용해 watch
로 상태를 구독합니다.상태가 바뀌면 자동으로 빌드가 다시 일어납니다.
class HomePage extends ConsumerWidget {
const HomePage({super.key});
@override
Widget build(BuildContext context, WidgetRef ref) {
final count = ref.watch(homeProvider); // 상태 구독
return Scaffold(
body: Center(
child: Text('$count', style: const TextStyle(fontSize: 50)),
),
floatingActionButton: FloatingActionButton(
onPressed: () {
// 행위 호출은 read
ref.read(homeProvider.notifier).increase();
},
child: const Icon(Icons.add),
),
);
}
}
ref.watch(homeProvider)
→ 상태값 구독
ref.read(homeProvider.notifier)
→ 행위(메서드) 호출
2) read – 단발성 접근
build
가 아닌 이벤트 핸들러, initState
등에서 read
를 사용하면값이 바뀌어도 UI가 다시 그려지지 않습니다.
5. Riverpod 동작 흐름

Build(화면)
↓ watch(ref.watch)
Provider(관리자)
↓
Notifier(ViewModel, 창고)
↓
State(값)
- Build(화면)가
watch
로 Provider에 구독 신청
- Provider는 Notifier(창고)를 통해 State를 관리
- State가 바뀌면 구독 중인 화면만 자동 리빌드
6. 핵심 포인트 한눈에
watch
: 상태값 구독 (UI 리빌드 O)
read
: 단발성 접근 (UI 리빌드 X)
Notifier
: 상태 + 행위(ViewModel) 정의
NotifierProvider
: Notifier를 관리하는 Provider
ProviderScope
: 앱 전체 Provider 관리
7. 왜 Riverpod을 쓰는가?
setState()
보다 안전하고 전역적으로 상태를 공유할 수 있다.
BuildContext
와 독립적 → 어디서든 Provider 접근 가능
- 더 나은 테스트, 모듈화, 유지보수
Share article