Android/Jetpack Compose

Jetpack Compose ViewModel에서 State객체를 통한 Compose UI 업데이트

loppav6 2022. 10. 25. 14:42

Compose에서는 State객체를 이용하여 Observable하게 동작하도록 구현하는 것을 권장한다.

Compose UI는 State객체를 관찰하다가 State객체의 값이 변하면 Compose UI는 Re-Composition을 발생시켜 UI를 업데이트 한다.

developer 사이트의 Jetpack Compose를 소개하는 소스를 참고하여 예제를 만들어 보자.

본 예제에서는 별모양의 이미지를 클릭하면 On/Off 하는 기능을 만들어 볼 것이다.

먼저 ViewModel을 사용하기 위해 build.gradle 파일에 아래 항목을 추가한다.

(참고: https://developer.android.com/jetpack/compose/libraries#viewmodel)

dependencies {
	implementation "androidx.lifecycle:lifecycle-viewmodel-compose:2.5.1"
}

 

 

1. ViewModel Class 생성

class MyViewModel : ViewModel() {
    private val _callChange = mutableStateOf(false)
    val callChange: State<Boolean> = _callChange

    fun callChange() {
        _callChange.value = !_callChange.value
    }
}

 

2. MainView 생성

@Composable
fun MainView(viewModel: MyViewModel) {
    Column(
        Modifier
            .fillMaxSize()
    ) {
        Image(
            painter = if (viewModel.callChange.value) painterResource(id = android.R.drawable.star_big_on) else painterResource(
                id = android.R.drawable.star_big_off
            ),
            contentDescription = null,
            modifier = Modifier
                .size(100.dp, 100.dp)
                .align(Alignment.CenterHorizontally)
                .clickable { viewModel.callChange() }
        )
        AnimatedVisibility(
            visible = viewModel.callChange.value,
            modifier = Modifier.align(Alignment.CenterHorizontally)
        ) {
            Text(text = "Hello~ Star")
        }
    }
}

 

3. 결과

Image Compose UI는 State객체인 callChange가 변할 때마다 업데이트 된다.

private 변수는 _callChange는 외부에서 조작할 수 없고, public 변수 callChange는 외부에서 읽기용으로 사용한다. 이 간단한 방법으로 Reactive한 Compose UI를 개발할 수 있다.