본문 바로가기
프로그래밍

👨‍💻 [Flutter] Flutter 에서 Riverpod 는 무엇이며, 어떻게 활용할 수 있나요?

by 밝음의기둥 2024. 12. 5.
반응형

👨‍💻 안녕하세요, 윌리 프로젝트의 윌리 입니다.

Flutter 에서 Riverpod 는 무엇이며, 어떻게 활용할 수 있는지 간략히 알아보았습니다.


질문 >

Flutter 에서 Riverpod 는 무엇이며, 어떻게 활용할 수 있나요?

답변 >

Riverpod란?

Riverpod는 Flutter 애플리케이션의 상태 관리를 간단하고 효율적으로 처리할 수 있도록 설계된 상태 관리 라이브러리입니다. 기존의 Provider 라이브러리에서 영감을 받아 개발되었으며, 더 강력하고 현대적인 기능을 제공합니다.

Riverpod은 컴파일 타임에 오류를 감지하고, 앱의 상태를 안전하고 간편하게 관리할 수 있도록 돕습니다. 전역 상태 관리지역 상태 관리 모두를 지원하며, 비동기 상태 관리에도 적합합니다.


Riverpod의 주요 특징

  1. 컴파일 타임 오류 감지:
    • 잘못된 상태 정의나 접근을 컴파일 타임에 발견 가능.
  2. 전역 및 지역 상태 관리 지원:
    • 필요에 따라 상태를 전역 또는 지역적으로 관리할 수 있습니다.
  3. 비동기 상태 관리:
    • FutureProvider, StreamProvider 등으로 비동기 데이터를 손쉽게 관리.
  4. 의존성 관리:
    • 상태 간의 의존성을 명확하게 정의할 수 있습니다.
  5. 호출 순서와 무관:
    • 상태를 선언한 순서와 호출 순서가 무관하게 작동.
  6. Dart null-safety 지원:
    • Null-safety를 완벽히 지원하여 안전한 코드 작성 가능.

Riverpod의 설치

  • pubspec.yaml에 의존성 추가:
dependencies:
  flutter:
    sdk: flutter
  flutter_riverpod: ^2.0.0

  • 의존성 설치:
flutter pub get


기본 사용법

1. 상태 관리의 기본 흐름

Riverpod에서는 상태를 관리하기 위해 Provider를 정의하고, 이를 위젯에서 구독하거나 값을 읽습니다.

import 'package:flutter/material.dart';
import 'package:flutter_riverpod/flutter_riverpod.dart';

// 1. 상태를 제공할 Provider 정의
final counterProvider = StateProvider<int>((ref) => 0);

void main() {
  runApp(
    // 2. ProviderScope로 앱 래핑
    ProviderScope(child: MyApp()),
  );
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: CounterScreen(),
    );
  }
}

class CounterScreen extends ConsumerWidget {
  @override
  Widget build(BuildContext context, WidgetRef ref) {
    // 3. 상태 읽기
    final count = ref.watch(counterProvider);

    return Scaffold(
      appBar: AppBar(title: Text('Riverpod Counter Example')),
      body: Center(
        child: Text(
          'Count: $count',
          style: TextStyle(fontSize: 24),
        ),
      ),
      floatingActionButton: FloatingActionButton(
        // 4. 상태 업데이트
        onPressed: () => ref.read(counterProvider.notifier).state++,
        child: Icon(Icons.add),
      ),
    );
  }
}


주요 Provider 유형

1. StateProvider

  • 간단한 상태를 관리하는 데 사용됩니다.
final counterProvider = StateProvider<int>((ref) => 0);

2. FutureProvider

  • 비동기 데이터를 관리합니다.
final futureProvider = FutureProvider<String>((ref) async {
  await Future.delayed(Duration(seconds: 2));
  return 'Hello, Riverpod!';
});

사용 예제:

class FutureExample extends ConsumerWidget {
  @override
  Widget build(BuildContext context, WidgetRef ref) {
    final asyncValue = ref.watch(futureProvider);

    return asyncValue.when(
      data: (data) => Text(data),
      loading: () => CircularProgressIndicator(),
      error: (error, stack) => Text('Error: $error'),
    );
  }
}

3. StreamProvider

  • 스트림 데이터를 관리합니다.
final streamProvider = StreamProvider<int>((ref) {
  return Stream.periodic(Duration(seconds: 1), (count) => count);
});

사용 예제:

class StreamExample extends ConsumerWidget {
  @override
  Widget build(BuildContext context, WidgetRef ref) {
    final asyncValue = ref.watch(streamProvider);

    return asyncValue.when(
      data: (data) => Text('Stream value: $data'),
      loading: () => CircularProgressIndicator(),
      error: (error, stack) => Text('Error: $error'),
    );
  }
}

4. StateNotifierProvider

  • 복잡한 상태를 관리하는 데 사용됩니다.
class CounterNotifier extends StateNotifier<int> {
  CounterNotifier() : super(0);

  void increment() => state++;
}

final counterNotifierProvider =
    StateNotifierProvider<CounterNotifier, int>((ref) => CounterNotifier());

사용 예제:

class NotifierExample extends ConsumerWidget {
  @override
  Widget build(BuildContext context, WidgetRef ref) {
    final count = ref.watch(counterNotifierProvider);

    return Scaffold(
      body: Center(
        child: Text('Count: $count'),
      ),
      floatingActionButton: FloatingActionButton(
        onPressed: () => ref.read(counterNotifierProvider.notifier).increment(),
        child: Icon(Icons.add),
      ),
    );
  }
}


장점

  1. 코드 가독성:
    • 상태 관리를 명확하게 정의하여 코드 가독성이 높아짐.
  2. 안정성:
    • 컴파일 타임 오류 감지로 안정적인 코드 작성 가능.
  3. 테스트 용이성:
    • 상태를 분리하여 테스트하기 쉬움.
  4. 효율성:
    • 필요한 상태만 구독하여 성능 최적화.
  5. 의존성 관리:
    • 상태 간의 의존성을 명확히 정의할 수 있음.

단점

  1. 학습 곡선:
    • 초보자에게는 다소 복잡하게 느껴질 수 있음.
  2. 커뮤니티 크기:
    • Provider에 비해 상대적으로 작은 커뮤니티.
  3. 의존성 관리가 복잡할 수 있음:
    • 복잡한 앱에서는 의존성 트리가 깊어질 수 있음.

활용 사례

  1. 소규모 앱:
    • Counter 앱, 단순 데이터 전송 앱.
  2. 비동기 데이터 관리:
    • API 호출, 스트림 데이터 처리.
  3. 복잡한 앱 구조:
    • 상태 간 의존성이 많은 대규모 애플리케이션.

결론

Riverpod은 Flutter에서 안정적이고 효율적인 상태 관리를 제공하는 강력한 라이브러리입니다. 간단한 앱부터 대규모 애플리케이션까지 다양한 상황에서 활용 가능하며, 특히 비동기 작업상태 간 의존성 관리에 적합합니다. 기존 Provider 라이브러리보다 강력하고 현대적인 접근 방식을 제공하므로, 새로운 프로젝트에서 적극적으로 고려할 만한 도구입니다.


"이 포스팅은 쿠팡 파트너스 활동의 일환으로, 이에 따른 일정액의 수수료를 제공받습니다."


🎬 유튜브 채널 🎬

 

위로그@WiLog

📢 안녕하세요, 위로그@WiLog 시청자 여러분, 저는 윌리 입니다. 📢 위로그@WiLog 는 자기주도학습을 목적으로 라이브 스트리밍을 합니다. 📢 1인 게임 개발을 목표로 Unreal과 Blender를 학습 중입니

www.youtube.com

🎬 치지직 채널 🎬

 

위로그 채널 - CHZZK

지금, 스트리밍이 시작됩니다. 치지직-

chzzk.naver.com


반응형