본문 바로가기

상태 관리 - Provider를 이용한 상태 관리 기초

에온르 2024. 6. 8.
반응형

Flutter 애플리케이션을 개발할 때 상태 관리는 매우 중요한 부분입니다. 이번 강의에서는 Provider 패키지를 사용하여 상태를 관리하는 방법을 배워보겠습니다. Provider는 Flutter에서 상태 관리를 쉽게 할 수 있도록 도와주는 패키지로, 많은 Flutter 개발자들이 사용하는 상태 관리 솔루션입니다.

source : medium @bancolombia

Provider 패키지 설치

먼저, Provider 패키지를 설치해야 합니다. pubspec.yaml 파일에 provider 패키지를 추가합니다.

dependencies:
  flutter:
    sdk: flutter
  provider: ^5.0.0

터미널에서 flutter pub get 명령을 실행하여 패키지를 설치합니다.


Provider의 기본 개념

Provider는 ChangeNotifier와 Consumer를 활용하여 상태를 관리합니다. ChangeNotifier는 상태를 저장하고 변경 사항을 알리는 역할을 하며, Consumer는 상태를 구독하여 상태가 변경될 때마다 UI를 업데이트합니다.

ChangeNotifier 클래스 만들기

먼저, 상태를 관리할 ChangeNotifier 클래스를 만들어보겠습니다.

import 'package:flutter/material.dart';

class Counter with ChangeNotifier {
  int _count = 0;

  int get count => _count;

  void increment() {
    _count++;
    notifyListeners();
  }

  void decrement() {
    _count--;
    notifyListeners();
  }
}

Counter 클래스는 _count 변수를 가지고 있으며, increment와 decrement 메서드를 통해 _count 값을 증가시키거나 감소시킵니다. 상태가 변경될 때 notifyListeners 메서드를 호출하여 구독자들에게 알립니다.

Provider 설정하기

이제 ChangeNotifierProvider를 사용하여 Counter 클래스를 제공하고, Consumer를 사용하여 상태를 구독하는 방법을 알아보겠습니다.

import 'package:flutter/material.dart';
import 'package:provider/provider.dart';
import 'counter.dart'; // Counter 클래스를 정의한 파일

void main() {
  runApp(
    ChangeNotifierProvider(
      create: (context) => Counter(),
      child: MyApp(),
    ),
  );
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: Text('Provider 예제'),
        ),
        body: CounterScreen(),
      ),
    );
  }
}

class CounterScreen extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return Center(
      child: Column(
        mainAxisAlignment: MainAxisAlignment.center,
        children: <Widget>[
          Text(
            '카운터 값:',
          ),
          Consumer<Counter>(
            builder: (context, counter, child) {
              return Text(
                '${counter.count}',
                style: Theme.of(context).textTheme.headline4,
              );
            },
          ),
          Row(
            mainAxisAlignment: MainAxisAlignment.center,
            children: <Widget>[
              IconButton(
                icon: Icon(Icons.add),
                onPressed: () {
                  Provider.of<Counter>(context, listen: false).increment();
                },
              ),
              IconButton(
                icon: Icon(Icons.remove),
                onPressed: () {
                  Provider.of<Counter>(context, listen: false).decrement();
                },
              ),
            ],
          ),
        ],
      ),
    );
  }
}

코드 설명

  1. ChangeNotifierProvider: Counter 객체를 생성하고 ChangeNotifierProvider를 사용하여 Counter를 제공해줍니다.
  2. Consumer: Counter 객체를 구독하여 상태가 변경될 때마다 UI를 업데이트합니다. builder 메서드 내에서 상태에 따라 UI를 다시 그립니다.
  3. Provider.of<Counter>: listen: false로 설정하여 상태 변경을 구독하지 않고 increment와 decrement 메서드를 호출합니다.

실습: 카운터 애플리케이션 만들기

이번 실습에서는 간단한 카운터 애플리케이션을 만들어보겠습니다. 사용자가 버튼을 눌러 카운터 값을 증가시키거나 감소시킬 수 있습니다.

main.dart

import 'package:flutter/material.dart';
import 'package:provider/provider.dart';
import 'counter.dart'; // Counter 클래스를 정의한 파일

void main() {
  runApp(
    ChangeNotifierProvider(
      create: (context) => Counter(),
      child: MyApp(),
    ),
  );
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: Text('카운터 애플리케이션'),
        ),
        body: CounterScreen(),
      ),
    );
  }
}

class CounterScreen extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return Center(
      child: Column(
        mainAxisAlignment: MainAxisAlignment.center,
        children: <Widget>[
          Text(
            '카운터 값:',
          ),
          Consumer<Counter>(
            builder: (context, counter, child) {
              return Text(
                '${counter.count}',
                style: Theme.of(context).textTheme.headline4,
              );
            },
          ),
          Row(
            mainAxisAlignment: MainAxisAlignment.center,
            children: <Widget>[
              IconButton(
                icon: Icon(Icons.add),
                onPressed: () {
                  Provider.of<Counter>(context, listen: false).increment();
                },
              ),
              IconButton(
                icon: Icon(Icons.remove),
                onPressed: () {
                  Provider.of<Counter>(context, listen: false).decrement();
                },
              ),
            ],
          ),
        ],
      ),
    );
  }
}

코드 설명

  1. ChangeNotifierProvider: Counter 객체를 생성하고 ChangeNotifierProvider를 사용하여 Counter를 제공해줍니다.
  2. Consumer: Counter 객체를 구독하여 상태가 변경될 때마다 UI를 업데이트합니다. builder 메서드 내에서 상태에 따라 UI를 다시 그립니다.
  3. Provider.of<Counter>: listen: false로 설정하여 상태 변경을 구독하지 않고 increment와 decrement 메서드를 호출합니다.

FAQ

Q: Provider와 ChangeNotifier의 차이점은 무엇인가요?

A: Provider는 Flutter의 상태 관리 패키지로, 상태 객체를 애플리케이션의 다른 부분에서 사용할 수 있도록 제공합니다. ChangeNotifier는 상태를 저장하고 변경 사항을 알리는 역할을 하는 클래스입니다. Provider를 사용하여 ChangeNotifier 객체를 애플리케이션의 다른 부분에서 사용할 수 있습니다.

Q: 여러 개의 Provider를 사용할 수 있나요?

A: 네, MultiProvider를 사용하여 여러 개의 Provider를 사용할 수 있습니다. MultiProvider는 providers 속성에 여러 Provider를 추가할 수 있습니다.

MultiProvider(
  providers: [
    ChangeNotifierProvider(create: (context) => Counter()),
    ChangeNotifierProvider(create: (context) => AnotherModel()),
  ],
  child: MyApp(),
);

Q: 상태 변경을 구독하지 않고 상태를 사용할 수 있나요?

A: 네, Provider.of<Counter>(context, listen: false)를 사용하여 상태 변경을 구독하지 않고 상태를 사용할 수 있습니다. 이 방법은 버튼 클릭과 같은 이벤트 핸들러에서 상태를 업데이트할 때 유용합니다.


결론

이번 강의를 통해 Flutter에서 Provider를 사용하여 상태를 관리하는 방법을 배웠습니다. ChangeNotifier와 Consumer를 활용하여 상태를 관리하고, 간단한 카운터 애플리케이션을 만들어보았습니다. 실습을 통해 상태 관리의 기본 개념을 이해하고 실제 애플리케이션에 적용해 보았습니다. 다음 강의에서는 더 복잡한 상태 관리 기법과 다른 패키지들을 알아보겠습니다. 상태 관리를 통해 더 효율적이고 유지보수하기 쉬운 코드를 작성해 보세요!

반응형

댓글