이번엔 지난 글에서 다룬 Flutter 위젯의 상태를 관리하는 방법에 대해 살펴보자.
Flutter에서 위젯의 상태란? 👉 위젯의 상태에 대한 이야기
위젯의 상태관리
지난 글을 통해 Flutter는 상태를 기반으로 위젯을 구축하며 UI를 언제든 재구축하기 위해 상태를 필요로 한다는 것을 확인했다!
사실 임시 상태의 경우에는 StatefulWidget과 setState()를 사용해 관리할 수 있지만 앱 전반에 걸친 복잡한 상태나 여러 위젯 간에 공유되어야 하는 데이터에 해당하는 앱 상태의 경우 생명주기 전체에 걸쳐있기 때문에 상태관리를 사용하여 관리가 필요하다.
이때 필요한 것이 바로 상태 관리 라이브러리다!
상태관리란?
- 데이터 (상태)를 효과적으로 관리하고 추적하는 프로세스.
- UI가 데이터 변화에 따라 잘 동작하게 하는 역할을 하기 때문에 특히 UI가 복잡할 때 중요한 역할을 한다.
앱이 사용자와 상호작용하면서 데이터 (=상태)는 변경된다. 이때 상태는 로그인 상태, 서버에서 가져온 데이터 상태, 등을 다 포함할 수 있다.
UI가 데이터 변화에 따라 잘 동작해야하기 때문에 특히 UI가 복잡할 때 상태관리는 중요한 역할을 한다.
1. provider
- 상태를 관리하는 provider클래스 , 상태 업데이트를 알리는 ChangeNotifier클래스, 상태 변경 시 랜더링되는 Consumer 위젯으로 구성되어 있다.
- 위젯 트리 전체에서 상태를 공유하고 업데이트하는 데 사용되는 방법인데, 즉 위젯 트리에서 상위노드에서 하위 노드로 상태를 전달한다.
- ChangeNotifier : 데이터가 변경되면 Consumer에게 알리는 역할을 한다.
- Consumer: 상태가 변경될 때마다 자동으로 다시 렌더링되는 위젯이다.
2. riverpod
- Riverpod은 Provider의 기본 기능을 확장하여 의존성 주입 및 비동기 처리와 같은 고급 기능을 지원한다.
- Provider와 달리 상태를 불변 객체로 관리하여 상태 변경을 보다 안전하게 처리할 수 있다.
- ProviderContainer, ScopedProvider를 사용하여 상태를 관리한다.
3. bloc
- 이벤트와 상태를 기반으로 작동한다.
- 디테일하게 이벤트 트래킹이 가능하여 stream을 프로젝트 내에서 사용한다면 bloc으로 상태관리를 하는 것이 좋다고 한다.
- 상태를 이벤트와 리듀서를 통해 관리하고, UI는 상태의 변화에 따라 업데이트 된다.
- 다른 라이브러리에 비해 러닝커브가 높다.
4. getX
- 경량화된 상태관리 라이브러리다.
- 간단한 코드만으로도 쉽게 각종 기능 구현이 가능하여 생산성은 최고다! 선언을 자유롭게 할 수 있다.
- 다만 기존 플러터의 코드가 아닌 getX에 의존해서 구현해야하기 때문에 플러터가 아닌 getX를 배우는 상황이 될 수 있다고 한다.
- 모든걸 getX에 의존해야한다 (dialog, page 넘길때)
*참고)
Flutter에서는 프로젝트 규모, 상황에 따라 라이브러리를 선택하게 되는데 중-대규모 프로젝트에 Bloc이 어울린다고 한다.