본문 바로가기

개발일지/Android

[Android] Jetpack Compose ViewModel 추가

ViewModel을 사용하면 액티비티가 소멸되고 다시 생성될 때 폐기되지 않는 앱 관련 데이터를 저장한다. 즉, ViewModel 객체는 소멸되지 않는다.

앱은 자동으로 ViewModel 객체를 유지하므로 객체가 보유하고 있는 데이터를 재구성하여 즉시 사용할 수 있다

아키텍처 구성요소 라이브러리에서 가져온 ViewModel 클래스를 확장하고 이 클래스 내에 앱 데이터를 저장하여 ViewModel 을 구현한다!

 

1. 종속성 추가

implementation("androidx.lifecycle:lifecycle-viewmodel-compose:2.6.1")

Compose 앱에 수명 주기 인식 ViewModel을 추가하는 데 사용된다.

 

2. 클래스 생성

ui 패키지에 ViewModel 클래스를 만든다.

import androidx.lifecycle.ViewModel

class MyPageViewModel : ViewModel() {
}

 

3. 상태 UI의 모델 클래스 추가

data class MyPageViewState(
        val loadState: LoadState = LoadState.SUCCESS,
        val nickname: String = "",
        val phoneNumber: String = ""
    )

 

4. StateFlow

StateFlow : 현재 상태와 새로운 상태 업데이트를 내보내는 관찰 가능한 데이터 홀더 흐름

즉, 현재 상태를 업데이트하고 흐름에 전송하여 값을 반영한다.

MyPageViewModel 클래스에서 _uiState 속성을 추가한다.

import kotlinx.coroutines.flow.MutableStateFlow

class MyPageViewModel: ViewModel() {
    private val _uiState = MutableStateFlow(MyPageContract.MyPageViewState())
}

 

5. 자원 속성

import kotlinx.coroutines.flow.StateFlow
import kotlinx.coroutines.flow.asStateFlow

class MyPageViewModel: ViewModel() {
    private val _uiState = MutableStateFlow(MyPageContract.MyPageUiState())
    val uiState: StateFlow<MyPageContract.MyPageUiState> = _uiState.asStateFlow()
}

_uiState는 ViewModel 내부에서만 접근/수정 가능,

uiState는 다른 클래스에서 접근 가능하지만 읽기 전용으로 get() 메서드로만 변경할 수 있다.

uiState를 _uiState.asStateFlow()로 설정한다 → 변경 가능 상태 흐름을 읽기 전용 상태 흐름으로 만든다.