본문 바로가기
카테고리 없음

[Flutter] Provider vs Riverpod

by YJHTPII 2024. 12. 10.
반응형

 

Provider

Provider는 Flutter에서 가장 널리 사용되는 상태 관리 라이브러리 중 하나로, 전역 상태 관리를 간편하게 처리할 수 있도록 도와줍니다. Provider는 InheritedWidget을 기반으로 하고 있으며, 상태를 앱의 위젯 트리에 효율적으로 전달합니다.

 

주요 개념:

  • Provider: 데이터를 제공하는 역할을 하며, 데이터를 하위 위젯으로 전달합니다.
  • Consumer: Provider로부터 데이터를 읽고, 그 데이터가 변경될 때 UI를 갱신하는 역할을 합니다.
  • ChangeNotifier: 상태를 관리하는 클래스로, 데이터의 변경을 알리고 UI에 갱신을 요청할 수 있도록 도와줍니다.

기본 사용 예시

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

// 상태를 관리하는 클래스
class Counter with ChangeNotifier {
  int _count = 0;

  int get count => _count;

  void increment() {
    _count++;
    notifyListeners();  // 상태가 변경되었음을 알리기
  }
}

void main() {
  runApp(
    // 전체 애플리케이션에 Provider를 제공
    ChangeNotifierProvider(
      create: (context) => Counter(),
      child: MyApp(),
    ),
  );
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: Text('Provider Example'),
        ),
        body: Center(
          child: Consumer<Counter>(
            builder: (context, counter, child) {
              return Text(
                'Counter: ${counter.count}',
                style: TextStyle(fontSize: 30),
              );
            },
          ),
        ),
        floatingActionButton: FloatingActionButton(
          onPressed: () {
            // 상태 업데이트
            context.read<Counter>().increment();
          },
          child: Icon(Icons.add),
        ),
      ),
    );
  }
}

 

 

Provider의 주요 특징:

  • Context 의존성: Provider를 사용할 때 항상 BuildContext를 사용하여 접근합니다. 예를 들어, Provider.of(context)나 Consumer를 사용하여 상태를 읽고 변경할 수 있습니다.
  • 자동 상태 변경: ChangeNotifier를 사용하면 상태가 변경될 때 UI를 자동으로 업데이트할 수 있습니다.
  • 의존성 주입: Provider는 다양한 의존성을 주입할 수 있어, 앱의 규모가 커져도 유지보수가 용이합니다.

장점:

  • Flutter에서 기본적으로 권장하는 상태 관리 라이브러리입니다.
  • 간단하고 직관적인 API를 제공합니다.
  • UI와 상태 변경을 분리하여 코드의 가독성을 높여줍니다.

단점:

  • 특정 상태를 관리하는 방식에서는 상태의 범위나 접근성을 제대로 이해하지 못하면 불편할 수 있습니다.
  • 복잡한 애플리케이션에서 더 많은 코드와 설정이 필요할 수 있습니다.

 

 

Riverpod

Riverpod는 Provider의 창시자인 Remi Rousselet이 만든 새로운 상태 관리 라이브러리로, Provider의 문제점을 보완하고 더 발전된 기능을 제공합니다. Riverpod는 상태 관리의 확장성유연성을 강조하며, 상태 관리가 보다 안전하고 예측 가능한 방식으로 이루어지도록 합니다.

주요 개념:

  • Provider: 상태를 제공하는 기본적인 단위로, Riverpod에서는 상태를 제공하는 객체를 직접 생성합니다.
  • ConsumerWidget: Riverpod에서 UI를 갱신하는 위젯입니다. Consumer와 유사한 역할을 하며, WidgetRef를 통해 상태를 읽고 구독합니다.
  • StateNotifier: Riverpod에서 상태를 관리하는 클래스입니다. 상태를 업데이트하고, UI에 알리기 위해 사용됩니다.

기본 사용 예시

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

// 상태를 관리하는 로직
final counterProvider = StateNotifierProvider<Counter, int>((ref) {
  return Counter();
});

class Counter extends StateNotifier<int> {
  Counter() : super(0);

  void increment() => state++;
}

void main() {
  runApp(
    ProviderScope(  // Riverpod의 ProviderScope는 상태를 유지합니다.
      child: MyApp(),
    ),
  );
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: Text('Riverpod Example'),
        ),
        body: Center(
          child: Consumer(
            builder: (context, watch, child) {
              final count = watch(counterProvider);  // 상태 읽기
              return Text(
                'Counter: $count',
                style: TextStyle(fontSize: 30),
              );
            },
          ),
        ),
        floatingActionButton: FloatingActionButton(
          onPressed: () {
            // 상태 업데이트
            context.read(counterProvider.notifier).increment();
          },
          child: Icon(Icons.add),
        ),
      ),
    );
  }
}

Riverpod의 주요 특징:

  • 상태의 독립성: Riverpod는 Provider와 달리 BuildContext에 의존하지 않습니다. 대신, WidgetRef를 사용하여 상태를 직접 읽고 업데이트합니다.
  • 유연성: Riverpod는 다양한 종류의 Provider를 제공하여, 상태의 의존성을 더 잘 관리할 수 있습니다. 예를 들어, StateProvider, FutureProvider, StreamProvider 등이 있습니다.
  • 테스트 용이성: Riverpod는 테스트하기 용이한 구조로 설계되어 있습니다. 상태를 명시적으로 관리하고, 테스트 시 의존성을 쉽게 주입할 수 있습니다.

장점:

  • 상태 관리의 안전성: 상태의 변화가 더 명확하고 예측 가능합니다.
  • 성능 최적화: 상태 변경 시 필요한 위젯만 다시 빌드하여 성능을 최적화할 수 있습니다.
  • Context 의존 없음: BuildContext와 분리되어 코드가 더 깨끗하고, 테스트가 용이합니다.
  • 강력한 상태 추적: 의존성 관리와 상태 추적이 뛰어나, 디버깅이 더 쉬워집니다.

단점:

  • Riverpod는 Provider에 비해 설정이 더 복잡하고, 초기 학습이 조금 더 필요할 수 있습니다.
  • 앱이 커지면 더 많은 Provider가 필요할 수 있으며, 이로 인해 관리가 조금 더 복잡해질 수 있습니다.

 

 

Provider:

  • 더 간단하고 직관적인 API로 빠르게 상태 관리를 시작할 수 있습니다.
  • ChangeNotifier와 함께 사용하여 UI와 상태 변경을 쉽게 분리할 수 있습니다.
  • 작은 규모의 프로젝트나 간단한 상태 관리에 유용합니다.

Riverpod:

  • 더 높은 유연성과 안전성을 제공하며, 복잡한 상태 관리가 필요한 앱에 적합합니다.
  • 상태 관리의 성능 최적화와 테스트 용이성에서 우수한 특성을 보입니다.
  • 더 많은 기능과 확장성을 제공하여, 더 복잡한 애플리케이션에서 유리합니다.

두 라이브러리는 각각의 장점이 있으므로, 프로젝트의 복잡도와 요구 사항에 맞는 상태 관리 라이브러리를 선택하는 것이 중요합니다.

반응형

댓글