일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
31 |
- pytorch
- FastAPI
- Algorithm
- fastapi를 사용한 파이썬 웹 개발
- Dreamhack
- Widget
- Kaggle
- system hacking
- bloc
- 파이토치 트랜스포머를 활용한 자연어 처리와 컴퓨터비전 심층학습
- Got
- BOF
- MATLAB
- PCA
- Image Processing
- Stream
- rao
- DART
- BAEKJOON
- 영상처리
- C++
- llm을 활용 단어장 앱 개발일지
- ML
- 백준
- Flutter
- BFS
- ARM
- Computer Architecture
- study book
- MDP
- Today
- Total
Bull
[Flutter::State] ChangeNotifierProvider와 Provider 차이 본문
[Flutter::State] ChangeNotifierProvider와 Provider 차이
Bull_ 2024. 8. 23. 00:44ChangeNotifierProvider
주로 객체의 상태가 변하고, 이 상태 변화에 따라 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
는 객체의 생성과 소멸을 위젯의 수명 주기에 맞춰 자동으로 관리할 수 있다. 예를 들어, 화면이 없어지면 자동으로 객체를 정리하는 등의 기능이 제공된다. 만약 직접 객체를 생성하면 이 모든 것을 수동으로 관리해야 하며, 이는 실수나 메모리 누수를 일으킬 수 있다.
'Software Framework > Flutter' 카테고리의 다른 글
[Flutter::Widget] StatefulBuilder (0) | 2024.08.27 |
---|---|
[Flutter::Widget] Dialog 종류 (0) | 2024.08.27 |
[Flutter::package] "pdf" package review 하기 (0) | 2024.08.21 |
[Flutter::News] LG TV webOS 기반 애플리케이션 Flutter 추진 요약 (0) | 2024.08.20 |
[Flutter] 플러터에서 마크다운 적용하기! (0) | 2024.08.18 |