inblog logo
|
Gyeongwon's blog
    FlutterDart

    [Flutter #9] Riverpod

    도경원's avatar
    도경원
    Sep 27, 2025
    [Flutter #9] Riverpod
    Contents
    1. read vs watch2. Riverpod 세팅3. 창고 만들기 (State + 행위)4. UI에서 창고 사용하기5. Riverpod 동작 흐름6. 핵심 포인트 한눈에7. 왜 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
    Contents
    1. read vs watch2. Riverpod 세팅3. 창고 만들기 (State + 행위)4. UI에서 창고 사용하기5. Riverpod 동작 흐름6. 핵심 포인트 한눈에7. 왜 Riverpod을 쓰는가?

    Gyeongwon's blog

    RSS·Powered by Inblog