Stacked - ViewModels

김례원·2025년 7월 6일

Flutter

목록 보기
7/12
post-thumbnail

👓 ViewModel이란?

ViewModel은 View(UI)와 Business Logic(서비스 등) 사이를 연결해주는 중간 역할을 합니다.
Stacked 프레임워크에서는 BaseViewModel 또는 다양한 특수 ViewModel 클래스를 상속받아 상태 관리와 로직 분리를 손쉽게 구현할 수 있습니다.

View는 ViewModel이 제공하는 데이터만 보고, ViewModel은 상태를 바꾸고 알립니다.


✅ 기본 ViewModel 사용법

1️⃣ BaseViewModel 상속

class CounterViewModel extends BaseViewModel {
  int _counter = 0;

  int get counter => _counter;

  void increment() {
    _counter++;
    notifyListeners();
  }
}
  • notifyListeners()를 호출하면 UI(View)가 자동으로 업데이트됩니다.

🛠️ 주요 ViewModel 타입들

ViewModel 타입설명
BaseViewModel상태를 수동으로 제어할 수 있는 기본 ViewModel
ReactiveViewModel특정 서비스의 변화에 반응하여 자동 갱신되는 ViewModel
FormViewModel@FormView와 함께 사용하는 Form 상태 관리 전용 ViewModel
FutureViewModel비동기 작업을 ViewModel 내에서 처리하고, 완료 후 View에 알림
StreamViewModel실시간 데이터 스트림과 View를 연결할 때 사용

🔄 상태 변경 알리기

void updateSomething() {
  // 데이터 변경
  notifyListeners();  // UI에게 변경 알림
}
  • 모든 ViewModel은 ChangeNotifier를 기반으로 하기 때문에 notifyListeners()를 통해 View를 갱신시킵니다.

🧪 테스트 용이성

  • ViewModel은 로직만 담당하기 때문에 UI에 의존하지 않고 단위 테스트가 가능합니다.
  • 특히 서비스 로직을 분리하면 mock 데이터를 활용한 테스트가 간편합니다.

🔍 예시: FutureViewModel

class UserViewModel extends FutureViewModel<User> {
  
  Future<User> futureToRun() => _userService.fetchUser();
}
  • ViewModel이 생성되면 자동으로 futureToRun()이 실행되고,
  • 데이터가 로드되면 View가 자동 갱신됩니다.

✅ 요약

요소설명
BaseViewModel가장 기본이 되는 ViewModel 클래스
notifyListeners()View 갱신 트리거
FutureViewModel비동기 데이터 처리에 적합
StreamViewModel실시간 데이터 처리에 적합
FormViewModel폼 상태를 쉽게 관리
ReactiveViewModel서비스 상태 변경을 View에 자동 반영

💡 Stacked ViewModel의 장점

  • View와 로직 완전 분리 (MVVM)
  • 테스트 작성이 쉬움
  • 다양한 ViewModel 타입으로 실무에 맞춘 구조 가능
  • ViewModel마다 생명주기(onModelReady, dispose)가 존재하여 관리 용이

알아보면 좋을 내용

  • 각 ViewModel 타입별 실전
  • ViewModelBuilder 커스터마이징 방법

출처 : Stacked 공식 문서 - ViewModels

profile
분야를 가리지 않는 개발자

0개의 댓글