Riverpod은 Flutter 애플리케이션에서 상태 관리를 쉽게 하고, 더 직관적이며 강력한 방식으로 설계된 패키지입니다. 기존의
provider
패키지에서 영감을 받았으며, 몇 가지 주요 개선 사항을 포함하고 있습니다.주요 특징
- 상태 의존성: 상태와 그 상태에 의존하는 다른 상태 간의 관계를 명확하게 선언할 수 있습니다.
- 안전한 상태 관리: Riverpod은 전역 상태를 안전하게 관리할 수 있는 방법을 제공합니다.
- 재사용성: 상태를 재사용하고, 여러 위젯에서 쉽게 공유할 수 있습니다.
- 테스트 용이성: Riverpod을 사용하면 상태와 비즈니스 로직을 독립적으로 테스트하기가 용이합니다.
기본 개념
- Provider: 상태(데이터)를 제공하는 역할을 합니다. 여러 가지 provider 유형이 있습니다.
- StateProvider: 단순한 상태를 관리합니다.
- NotifierProvider: 상태를 관리하기 위한 클래스(Notifier)를 제공합니다.
- StreamProvider: 스트림을 관리합니다.
- FutureProvider: 비동기 데이터를 관리합니다.
1. 의존성 주입 및 플러그인 설치

git bash를 이용하여 의존성을 주입할 수도 있습니다.
아래 플러그인도 추가합니다.

2. 기본적인 클래스 작성 내용
필수! 메인 메서드 변경 내용 :
void main() {
runApp(ProviderScope(child: MyApp())); // 여기가 중요!
}
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
home: HomePage(),
);
}
}
- 위와 같이 ProviderScope로 MyApp을 감싸야만 아래 예제를 실행할 수 있습니다.
- MyApp의 build 메서드가 호출되면 HomePage 클래스의 build 메서드가 호출됩니다.
HomePage 클래스 내용 :
import 'package:flutter/material.dart';
import 'home_body.dart';
class HomePage extends StatelessWidget {
@override
Widget build(BuildContext context) { // ref는 창고 관리자에게 접근할 수 있는 변수
print("HomePage build...");
return Scaffold(
body: HomeBody(),
);
}
}
- build가 호출되면 Scaffold(body에 HomeBody를 호출) 를 return합니다.
- 상태가 변경됨에 따라 리빌드 할 때 Scaffold까지 리빌드하지 않기 위해 HomeBody를 따로 구성하였습니다.
3. 상태 관리 관련 내용
HomeBody 클래스 내용 :
import 'package:flutter/material.dart';
import 'package:flutter_riverpod/flutter_riverpod.dart';
import 'home_page_vm.dart';
class HomeBody extends ConsumerWidget {
@override
Widget build(BuildContext context, WidgetRef ref) {
print("HomeBody build...");
int count = ref.watch(countProvider); // 이 때 창고가 만들어진다. watch를 통해 창고를 만들게 되면 스트림이 유지되며, 상태값이 변경되면 자동으로 리빌드 된다
// ref.read(countProvider); // watch와 동일하나, 스트림은 유지하지 않고 끊어진다.
CountVM vm = ref.read(countProvider.notifier); // write 하기 위해 객체 자체를 준다. (객체의 메서드를 호출하여 상태를 변경시키라는 뜻)
return Center(child: Column(
children: [
OutlinedButton(onPressed: () {
vm.add();
}, child: Text("증가")),
Text("$count", style: TextStyle(fontSize: 50),),
],
));
}
}
ViewModel을 사용하기 위해 ConsumerWidget 으로 변경하였습니다.
해당 위젯으로 변경하면, build 매개 변수로 WidgetRef ref 를 꼭 받아야 합니다.
주요 개념
- ref.watch(countProvider):
- 설명:
watch
는countProvider
가 만든 상태를 구독하고, 상태가 변경될 때 위젯을 리빌드합니다. 자료를 지속적으로 감시(스트림 유지)하므로, 상태가 변할 때마다 UI를 업데이트합니다.
- ref.read(countProvider):
- 설명:
read
는countProvider
의 현재 상태를 반환하지만, 상태 변화에 대한 지속적인 감시는 하지 않습니다. 즉, 한 번만 읽고 이후 상태 변경에 대해서는 반응하지 않습니다.
- ref.read(countProvider.notifier):
- 설명:
read
를 사용하여countProvider
의 notifier 객체를 가져옵니다. 이를 통해 상태 변경 메서드(여기서는vm.add()
)를 호출할 수 있습니다. notifier는 상태를 작성하고 관리하는 객체입니다.
ViewModel 내용 :
import 'package:flutter_riverpod/flutter_riverpod.dart';
// 창고 관리자
final countProvider = NotifierProvider<CountVM, int>(() {
print("창고 만들어짐");
return CountVM();
});
// 창고
class CountVM extends Notifier<int> {
@override
int build() {
return 20;
}
void add() {
state = state + 1;
}
}
1. Providor 정의
final countProvider = NotifierProvider<CountVM, int>(() {
print("창고 만들어짐");
return CountVM();
});
NotifierProvider
는 상태를 관리하는 프로바이더입니다. 여기서는CountVM
라는 클래스의 인스턴스를 생성하여 제공합니다.
- 역할:
countProvider
는 '창고 관리자'로서CountVM
의 인스턴스를 관리합니다.NotifierProvider
를 사용하여 Riverpod의 상태 관리를 쉽게 통합할 수 있습니다.
2. CountVM 클래스
class CountVM extends Notifier<int> {
@override
int build() {
return 20;
}
void add() {
state = state + 1;
}
}
CountVM
클래스는Notifier<int>
를 상속받아 상태 관리 기능을 확장합니다.
build
메서드:build
메서드는Notifier
의 초기 상태를 설정합니다. 여기서는 초기 상태를 20으로 설정하고 있습니다.
add
메서드:state
변수를 증가시키는 메서드입니다. 상태 값을 1씩 증가시킵니다.
흐름
- NotifierProvider를 통해
CountVM
인스턴스를 생성하여countProvider
를 정의합니다.
CountVM
클래스는Notifier<int>
를 상속받아 상태를 관리합니다.
build
메서드는 초기 상태를 설정합니다 (20
).
add
메서드는 상태를 1씩 증가시킬 수 있습니다.
위의 내용을 한번에 정리하기

Share article