Flutter

[Flutter] Riverpod 사용법

mjjayce 2025. 4. 14. 16:56

RiverPod이란? 

개발자가 상태관리를 편하게 할 수 있도록 도와주는 라이브러리

MVVM 아키텍처 구현과 관리 용이

 

사용법

A. ViewModel 만들기

1. 관리할 데이터를 담을 상태 클래스 만들기

class HomeState{
	int counter;
	HomeState(this.counter);
}

 

2. Notifier를 상속받는 ViewModel 클래스 만들기

class HomeViewModel extends Notifier<HomeState> {
  @override
  HomeState build() {
    return HomeState(1);
  }
  
  void updateState(){
	  state = HomeState(state.counter + 1);
  }
}

 

- 1) Notifier를 상속받으면 상태를 저장하고 업데이트할 수 있는 기능을 갖는다. 

     - ViewModel은 상태가 업데이트될 때 따로 Statefull widget처럼 setState() 하지 않아도 상태가 없데이트되는데, Notifier를 상속받는 것이 그 기능을 하게 해준다.

 

 - 2) Notifier 상속 시 이 ViewModel이 어떤 상태를 관리하는지 제너릭으로 지정해줘야 한다(위 코드 중 Notifier<HomeState>)

 

 - 3) Notifier 클래스의 build 메서드를 재정의해 초기 상태값을 return 한다.

     - Notifier 클래스의 build 메서드는 추상 메서드로 선언되어 있어, Notifier를 상속받은 ViewModel은 반드시 build를 재정의해주어야 한다.

     - '초기값을 리턴한다' 까지만 저장된 규칙이고, 해당 값을 어떻게 설정할 것인지는 사용자가 결정하는 것.

 

3. 뷰모델을 관리 및 공급해 줄 NotifierProvider 객체를 변수에 담는다

final homeViewModelProvider = NotifierProvider<HomeViewModel, HomeState>((){
		return HomeViewModel();
});

 

앞서 만든 HoveViewModel을 Provider로 감싸줌으로써

 - 상태 변경 시 UI 자동 업데이트

 - 필요 없는 경우 정리(dispose) 가 가능해진다. 

 

Provider 생성 시 제너릭으로 관리하는 뷰모델 타입과 관리하는 상태를 명시한다(<HomeViewModel, HomeState>)

 

 

B. 위젯에서 불러오기

Consumer(
	builder: (context, ref, child){
		ref.watch(homeViewModelProvider);
		return Column(children:[
			Text()
		]);
	}
)

 

Consumer : Riverpod 이 정의하는 위젯. Provider의 변경을 감지하고 필요할 때 해당 부분만 리빌드해줌.

 

ref.read(프로바이더) : 1회성. 실행될 때 상태를 읽어 오고 변경은 감지하지 못함

ref.watch(프로바이더) : 상태변경을 감지하여 상태 변경 일어날 때마다 재빌드

 

여기서는 ref.watch를 사용했으므로 HomeViewModel의 HomeState가 변경될 때마다 재빌드가 이루어진다.

 

 

C. 최상위 위젯 ProviderScope로 감싸기

void main() {
  // 이 앱에서 ViewModel을 RiverPod이 관리하게 해주게 해줌
  runApp(const ProviderScope(child: MyApp()));
}