관리 메뉴

Bull

[Flutter::State] ChangeNotifierProvider와 Provider 차이 본문

Software Framework/Flutter

[Flutter::State] ChangeNotifierProvider와 Provider 차이

Bull_ 2024. 8. 23. 00:44

ChangeNotifierProvider

주로 객체의 상태가 변하고, 이 상태 변화에 따라 UI를 업데이트해야 할 때 사용한다. ChangeNotifier를 상속받은 클래스에서 상태를 관리한다. 이 클래스는 상태가 변경될 때 notifyListeners() 메서드를 호출하여, 이 상태를 구독하고 있는 모든 위젯들이 리빌드되도록 알린다.


쇼핑 카트에 항목을 추가하거나 삭제할 때, 이런 상태 변화는 UI에 반영되어야 하므로 ChangeNotifierProvider를 사용한다.

class CartModel extends ChangeNotifier {
  List<Item> _items = [];

  List<Item> get items => _items;

  void addItem(Item item) {
    _items.add(item);
    notifyListeners();  // 알림
  }
}

ChangeNotifierProvider(
  create: (context) => CartModel(),
  child: MyApp(),
)

Provider

주로 상태 변화를 알릴 필요는 없지만, 객체를 트리 아래 여러 위젯에서 공유해야 할 때 사용한다. 상태를 알리거나 관리할 필요가 없는 단순한 객체를 제공할 때 사용된다. 설정이나, 한 번 생성된 후 변하지 않는 클래스 인스턴스를 여러 곳에서 공유해야 할 때 사용한다.

class SomeOtherClass {
  final String data;

  SomeOtherClass(this.data);
}

Provider(
  create: (context) => SomeOtherClass("Hello"),
  child: MyApp(),
)

따라서, ChangeNotifierProvider는 상태 변화가 필요할 때, Provider는 상태 변화가 필요 없는 단순한 객체를 공유할 때 사용된다고 이해하면 된다.

Provider는 그냥 인스턴스를 만드는 건가?

Provider는 기본적으로 그냥 객체(인스턴스)를 생성해서 Flutter 위젯 트리의 하위 위젯들에 전달하는 역할을 한다.

Provider는 단순히 어떤 클래스의 인스턴스를 생성해서 트리 하위의 다른 위젯에서 접근할 수 있도록 만든다. 이 인스턴스는 상태를 변경하거나, 상태 변화에 따라 UI를 업데이트하는 기능을 제공하지 않는다. 그래서 notifyListeners() 같은 메서드도 필요하지 않다.

 

결론적으로, Provider는 단순히 객체를 생성하고 이를 위젯 트리의 하위에서 공유할 수 있도록 하는 도구라고 보면 된다. 상태 변화 관리가 필요 없다면, Provider를 사용하여 인스턴스를 제공하면 된다.

그냥 class 정의해서 인스턴스를 만들면 되는 게 아닌가?

Provider를 사용하지 않고도 클래스 인스턴스를 직접 생성해서 사용할 수 있다. 그러나 Provider를 사용하는 데는 몇 가지 중요한 이유와 장점이 있다.

1. 위젯 트리에서의 접근성

Flutter에서는 위젯이 트리 구조로 되어 있고, 하위 위젯에서 상위 위젯의 데이터를 접근하려면 상위 위젯에서 하위 위젯으로 계속해서 데이터를 전달해야 한다. 이를 "prop drilling"이라고 하며, 트리가 깊어질수록 불편해진다. Provider를 사용하면 위젯 트리의 어디에서든 쉽게 클래스 인스턴스에 접근할 수 있다. 중간 위젯들이 불필요하게 데이터를 전달할 필요가 없어지는 장점이 있다.

2. 의존성 주입 (Dependency Injection)

Provider는 의존성 주입의 일환으로 많이 사용된다. 의존성 주입을 통해 애플리케이션의 여러 부분에서 동일한 객체에 접근할 수 있으며, 코드의 결합도를 낮추고 테스트 가능성을 높인다. 예를 들어, 여러 화면이나 위젯에서 동일한 서비스 클래스나 데이터 클래스에 접근해야 할 때, Provider를 사용하면 매우 쉽게 관리할 수 있다.

3. 재사용 가능성

Provider를 사용하면 애플리케이션 전체에서 동일한 인스턴스를 공유하거나, 필요할 때마다 인스턴스를 새로 생성하는 등의 유연한 구성이 가능하다. 이로 인해 코드 재사용성과 관리의 편의성이 크게 증가한다.

4. 수명 주기 관리

Provider는 객체의 생성과 소멸을 위젯의 수명 주기에 맞춰 자동으로 관리할 수 있다. 예를 들어, 화면이 없어지면 자동으로 객체를 정리하는 등의 기능이 제공된다. 만약 직접 객체를 생성하면 이 모든 것을 수동으로 관리해야 하며, 이는 실수나 메모리 누수를 일으킬 수 있다.