[Flutter #9] Riverpod

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

1. read vs watch

Riverpod의 핵심은 Provider(창고)와 ref(열쇠)입니다.
ref를 통해 Provider에 접근할 때 두 가지 방식이 있습니다.
  • watch
    • → 상태를 “구독”해서 값이 바뀌면 자동으로 UI를 다시 빌드
      → 주로 UI(화면)에서 사용
  • read
    • → 상태를 “한 번만 읽기”
      → 주로 행위(메서드 호출)가 필요할 때 사용 (UI 갱신 없이 단발성 접근)
watch
read
목적
상태 구독 & 자동 리빌드
상태/Notifier에 단발성 접근
사용 위치
build(), ConsumerWidget
onPressed, initState, 비즈니스 로직

2. Riverpod 세팅

  1. pubspec.yaml에 추가
    1. flutter_riverpod: ^2.6.1
  1. main.dart에서 앱 최상단을 ProviderScope로 감싼다.
    1. 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 동작 흐름

notion image
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

Gyeongwon's blog