[flutter] 플러터 Riverpod에서의 상태 저장 방법

플러터에서 상태 관리는 앱의 성능과 유지 보수성에 매우 중요합니다. 플러터의 상태 관리 라이브러리 중 하나인 Riverpod는 상태를 효율적으로 관리하고 공유하기 위한 훌륭한 도구입니다. 이번 블로그 포스트에서는 Riverpod를 사용하여 플러터 앱에서 상태를 저장하는 방법에 대해 알아보겠습니다.

1. 상태 프로바이더 생성하기

먼저, 상태 프로바이더를 생성해야 합니다. Riverpod에서 상태 프로바이더는 Provider 클래스를 통해 생성됩니다. 다음은 간단한 예제입니다.

final counterProvider = Provider<int>((ref) => 0);

위 예제에서 counterProviderProvider 클래스로 생성된 상태 프로바이더입니다. 이 경우, 상태 값은 int 형식으로 정의되며 초기값은 0으로 설정됩니다.

2. 상태 사용하기

상태 프로바이더를 사용하려면 Consumer 위젯을 사용하여 상태 변화를 구독해야 합니다. 다음은 예제 코드입니다.

Consumer(
  builder: (context, watch, _) {
    final counter = watch(counterProvider);
    return Text('Counter: $counter');
  },
)

위 예제에서 Consumer 위젯은 counterProvider를 구독하고 있습니다. watch 매개변수를 사용하여 상태 프로바이더에 저장된 값을 가져올 수 있습니다. 이 값을 사용하여 UI를 업데이트하거나 다른 로직을 수행할 수 있습니다.

3. 상태 업데이트하기

상태 프로바이더의 값을 업데이트하려면 해당 프로바이더에 접근하여 새로운 값을 할당해야 합니다. 다음은 예제 코드입니다.

final counterProvider = Provider<int>((ref) => 0);

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

  void increment() {
    state++;
  }
}

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

위 예제에서 CounterNotifier 클래스는 StateNotifier 클래스를 상속받아 상태 값을 업데이트하는 메서드를 제공합니다. 새로운 값을 할당하려면 state 속성을 사용하세요.

4. 상태 사용하기 (업데이트 포함)

상태 프로바이더를 업데이트한 값을 사용하려면 watch 매개변수 대신 read 매개변수를 사용해야 합니다. 다음은 예제 코드입니다.

Consumer(
  builder: (context, read, _) {
    final counter = read(counterProvider);
    final counterNotifier = read(counterNotifierProvider);

    return Column(
      children: [
        Text('Counter: $counter'),
        ElevatedButton(
          onPressed: () {
            counterNotifier.increment();
          },
          child: Text('Increment'),
        ),
      ],
    );
  },
)

위 예제에서 read 매개변수를 사용하여 counterProvidercounterNotifierProvider 상태 프로바이더를 읽을 수 있습니다. counterNotifierincrement 메서드를 호출하여 상태 값을 업데이트 할 수 있습니다.

결론

플러터 Riverpod는 효율적이고 유연한 상태 관리를 위한 강력한 도구입니다. 이번 포스트에서는 Riverpod를 사용하여 상태를 저장하고 업데이트하는 방법을 알아보았습니다. 상태 관리는 복잡한 앱 개발에 필수적이며, Riverpod를 통해 효율적으로 처리할 수 있습니다.