Dart/Flutter

[Riverpod] Riverpod 상태관리

  • -
728x90

 

Flutter에는 많은 상태관리 패키지들이 존재한다. 

그 중 Riverpod에 대해서 알아보자.

 

Riverpod는 Provider의 anagram(철자 바꾸기)이다. 

Riverpod는 Flutter/Dart의 반응형 캐싱 프래임워크로 선언적 프로그래밍과 반응형 프로그래밍을 사용하여 애플리케이션 로직의 상당 부분을 처리한다.

 

 

https://riverpod.dev/ko/docs/introduction/getting_started

 

Getting started | Riverpod

Try Riverpod online

riverpod.dev

설치

공식문서 상 아래와 같은 의존성들을 주입해주어야한다는데, 굳이? 다 필요한가 싶긴하다. 

예측일뿐 아직 뭐가 뭔지 모르니 우선 다 설치해주자.

flutter pub add flutter_riverpod
flutter pub add riverpod_annotation
flutter pub add dev:riverpod_generator
flutter pub add dev:build_runner
flutter pub add dev:custom_lint
flutter pub add dev:riverpod_lint

 

 

예제

간단한 Hello World 예제로 어떤 방식으로 Riverpod가 구성되는지 알아보자.

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

/// 'hello world'라는 값을 store하고 있는 provider
/// Provider를 사용하면 노출된 값을 모의/재정의할 수 있다.
/// Provider가 가지고 있는 매개변수를 store라고 한다.
final helloWorldProvider = Provider((ref) => 'hello world!');

void main() {
  runApp(
    /// 위젯이 Provider를 읽을 수 있도록
    /// 전체 앱을 ProviderScope 위젯으로 래핑
    /// 여기서 Provider의 상태가 저장된다.
    /// 
    /// 일반적으로 루트 위젯을 ProviderScope로 감싸서 하위 위젯트리에서 Provider객체에 접근할 수 있도록한다.
    /// 물론 루트 위젯을 감싸지 않고 사용할 수도 있다.
    const ProviderScope(
      child: App(),
    ),
  );
}

/// StatelessWidget 대신 Riverpod에 의해 노출되는 ConsumerWidget
///
/// ConsumerWidget은 StatefulWiget이 확장된 추상 클래스이다.
/// abstract class ConsumerStatefulWidget extends StatefulWidget {
/// ...
/// }
/// 
/// ConsumerWidget은 Provider 객체의 상태를 구독하고
/// 상태 변경이 있을 때마다 build를 호출하여 화면을 다시 그린다.
class App extends ConsumerWidget {
  const App({super.key});


  /// WidgetRef는 위젯 트리 내의 Provider 객체에 대한 참조를 제공한다
  /// 이를 통해 하위 위젯에서 Provider 객체를 생성하거나 액세스 할 수 있다.
  /// WidgetRef가 Provider객체에 엑세스하여 상태변경을 감지하면 현재 위젯에 다시 빌드 요청을 한다.
  /// 또한 WidgetRefsms context와 같은 역할을 해서 다른 위젯에서도 상태를 공유하는 역할을 한다.
  @override
  Widget build(BuildContext context, WidgetRef ref) {
    final value = ref.watch(helloWorldProvider);
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: const Text("hi"),
        ),
        body: Center(
          child: Text(value),
        ),
      ),
    );
  }
}

 

 

위의 주석과 같은식으로 처리된다

728x90
300x250
Contents

포스팅 주소를 복사했습니다

이 글이 도움이 되었다면 공감 부탁드립니다.