Provider 라이브러리란?
- 플러터에서 주로 쓰는 전역 상태 관리 솔루션
- 플러터의 반응형(Reactive) 특성과 잘 어울린다
주요 특징
- 단순함: 단순해서 중소규모 프로젝트와 초보자들이 사용하기에 적합하다.
- 효율성: 모델이 변경되면 해당 모델에 의존하는 위젯만 다시 빌드된다.
- 확장성: 단순하지만, 복잡한 애플리케이션에서도 사용할 수 있다.
- Flutter 와의 통합:
BuildContext
와 상속 위젯(InheritedWidget
) 같은 개념을 사용해 플러터 자체 상태 관리 방식과 조화롭게 작동한다.
작동 방식
Provider
생성: 상태를 저장할 프로바이더를 생성- 데이터 액세스: 위젯은 컨텍스트를 사용하여 프로바이더가 보유한 상태/데이터에 액세스할 수 있다. 보통
Provider.of<T>(context)
를 호출하거나 소비자 위젯을 사용하여 수행된다. - 변경 사항 리스너: 위젯은 공급자 데이터의 변경 사항을 리슨한다. 데이터가 변경되면
Provider
는 변경 사항을 반영하도록 알린다. - 데이터 수정:
Provider
의 데이터를 수정하면, 모든 리스너가 변경사항을 반영하여 업데이트된다.
용례
- 테마 관리: 다크모드 등
- 사용자 인증: 사용자 로그인 상태 및 세부 정보 추적
- 양식 입력 처리: 복잡한 양식 상태 및 유효성 검사를 관리
- 쇼핑 카트: 전자상거래 앱에서 카트 항목을 관리
예제 코드
final counter = Provider.of<Counter>(context);
에서 값을 가져오고 사용한다.- 상태가 변경되면
build()
메서드가 재실행된다.
class Counter with ChangeNotifier {
int _count = 0;
int get count => _count;
void increment() {
_count++;
notifyListeners(); // Notifies widgets to rebuild
}
}
class MyHomePage extends StatelessWidget {
@override
Widget build(BuildContext context) {
final counter = Provider.of<Counter>(context);
return Scaffold(
appBar: AppBar(title: Text('Provider Example')),
body: Center(child: Text('Count: ${counter.count}')),
floatingActionButton: FloatingActionButton(
onPressed: counter.increment,
tooltip: 'Increment',
child: Icon(Icons.add),
),
);
}
}
최상위 초기화
Provider
가 글로벌 상태 관리 도구로 작용하기 위해선 최상위에 초기화 작업을 한번 해줘야 한다.
void main() async {
WidgetsFlutterBinding.ensureInitialized();
await initializeDateFormatting();
final database = LocalDatabase();
GetIt.I.registerSingleton<LocalDatabase>(database);
final repository = ScheduleRepository();
final scheduleProvider = ScheduleProvider(repository: repository);
runApp(
ChangeNotifierProvider(
create: (_) => scheduleProvider,
child: const MaterialApp(
home: HomeScreen()
),
)
);
}
첨언
- 크고 복잡한 앱의 경우 요구사항과 선호도에 따라
Riverpod
,Bloc
,Redux
와 같은 다른 상태 관리 솔루션을 고려할 수 있다.
반응형
'플러터' 카테고리의 다른 글
플러터(Flutter) 에서 자주 쓰는 GetIt 패키지란? (0) | 2023.12.07 |
---|---|
플러터(Flutter) 의 글로벌 키(GlobalKey) 클래스란? (0) | 2023.12.06 |
플러터의 Drift 라이브러리(플러그인) 이란? (0) | 2023.12.03 |
플러터 (Flutter) 의 initializeDateFormatting() 메서드의 역할과 사용법 (0) | 2023.12.03 |
플러터(Flutter) 의 WidgetsFlutterBinding.ensureInitializing() 이란? (0) | 2023.12.02 |