guricode

[Flutter] Riverpod 상태관리 와 Provider상태관리 본문

앱/Flutter&Dart

[Flutter] Riverpod 상태관리 와 Provider상태관리

agentrakugaki 2025. 10. 20. 00:59

Riverpod은 Flutter에서 사용하는 의존성 주입 기반의 상태관리 라이브러리다. 기존의 프로바이더의 단점을 보완해 더 안전하고 테스트 가능한 구조를 제공한다.

프로바이더 객체를 선언해 전역상태를 관리하고 ref를 통해 해당상태를 읽거나 감시(read, watch)한다.

 

BuildContext에 의존하지않고 어디서든상태에 접근 가능하여 상태갱신을 자동으로 처리하는 상태관리 패던이다.

흐름은 Provider선언 -> viewmodel에서 ref로 상태 조작, UI에서 ref.watch로 상태를 감시한다.

Riverpod은 Provider의 철학을 계승하면서, “컴파일 타임 안정성 + 의존성 자동 추적”을 통해 실무 친화적 아키텍처 설계에 적합한 상태관리 패턴으로 발전했다.

 

예시코드

// 상태 선언
final counterProvider = StateProvider((ref) => 0);

// 사용
class CounterPage extends ConsumerWidget {
  @override
  Widget build(BuildContext context, WidgetRef ref) {
    final count = ref.watch(counterProvider);
    return Column(
      children: [
        Text('$count'),
        ElevatedButton(
          onPressed: () => ref.read(counterProvider.notifier).state++,
          child: const Text('증가'),
        ),
      ],
    );
  }
}

 

setState없이도 상태공유가 가능하며 코드구조가 명확해 유지보수가 쉽다. MVVM과 Clean Architecture와 결합하기 좋다.

 

 

 

Provider는 InheriteWidget 기반으로 BuildContext의존성이 있는 상태관리 패턴이다. 따라서 BuildContext를 통해 상태에 접근해야한다. (context.watch(),context.read() 등..

의존성을 수동을 ㅗ추적하며 리빌드시 상태초기화되는 경우가 존재한다.

Widget에 종속적이라 테스트가 어렵다.

// pubspec: provider
class Counter extends ChangeNotifier {
  int value = 0;
  void inc() { value++; notifyListeners(); }//notifyListeners()가 리스너 리빌드
}

void main() => runApp(
  ChangeNotifierProvider(create: (_) => Counter(), child: const App()),
);

class App extends StatelessWidget {
  const App({super.key});
  @override
  Widget build(BuildContext context) {
    final v = context.watch<Counter>().value; // BuildContext 의존
    return Scaffold(
      body: Center(child: Text('$v')),
      floatingActionButton: FloatingActionButton(
        onPressed: () => context.read<Counter>().inc(),
      ),
    );
  }
}