ViewModel을 사용하지 않고, 버튼 클릭시 텍스트 변경하기
setContent {
// 변경 가능한 State 변수를 만든다
// remember가 없으면 상태값 변경 시 setContent를 다시 돌면서 다시 Hello로 초기화 한다
// remember로 상태 변수를 기억하게 !
val data = remember {
mutableStateOf("Hello")
}
Column (
modifier = Modifier.fillMaxSize(),
verticalArrangement = Arrangement.Center,
horizontalAlignment = Alignment.CenterHorizontally,
) {
Text(
data.value,
fontSize = 30.sp,
)
Button(onClick = {
data.value = "World"
}) {
Text("변경")
}
}
remember 변수가 없으면 버튼을 눌렀을 때 값이 변경되지 않는다
→ 다시 setContent로 돌아와서 Hello를 할당하기 때문!
💡 remember 변수는 상태 변화 값을 기억한다 !
이렇게 하면 버튼 클릭시 텍스트가 변경된다.
ViewModel 활용하여 전환하기
- viewModel 생성
class MainViewModel: ViewModel() {
// remember 없이 관리
val data = mutableStateOf("Hellp")
}
ViewModel은 액티비티와 라이프사이클을 동일하게 가져간다
따라서, remember를 신경쓰지 않아도 된다 !
- viewModel 선언
class ViewModelActivity : ComponentActivity() {
// 뷰모델 사용하기
private val viewModel by viewModels<MainViewModel>()
- data.value를 viewMdoel.data.value로 변경
Text(
viewModel.data.value,
fontSize = 30.sp,
)
Button(onClick = {
viewModel.data.value = "World"
}) {
Text("변경")
}
동일하게 텍스트가 변화한다
Compose 안에서 ViewModel 사용하기
- Gradle 설정
// ViewModel
implementation 'androidx.lifecycle:lifecycle-viewmodel-compose:2.4.0-rc01'
- Compose 안에 선언
setContent {
// Compose 안에서 뷰모델 사용
val viewModel = viewModel<MainViewModel>()
뷰모델을 사용할 때 데이터를 외부에 공개하지 않는다
→ 뷰 쪽에서 데이터를 마음대로 조작할 수 있으므로 그것을 방지한다
뷰모델에서는 외부에서 접근이 안되도록 막는다
class MainViewModel: ViewModel() {
// remember 없이 관리
// 외부에서 볼 수 없도록 막는다
private val _data = mutableStateOf("Hello")
읽기 전용으로 공개한다 → 외부에서 수정할 수 없음
val data: State<String> = _data
위처럼 수정하게 되면
Button(onClick ={
viewModel.data.value = "World"
})
해당 view 코드에서 데이터에 접근하여 수정할 경우 에러가 발생한다
뷰모델에서 데이터 수정 메서드를 지정한다
class MainViewModel: ViewModel() {
// remember 없이 관리
// 외부에서 볼 수 없도록 막는다
private val _data = mutableStateOf("Hello")
// 읽기 전용 State 형식으로 공개 -> 외부에서 수정 불가
val data: State<String> = _data
// 외부에서 데이터를 수정하는 메서드 지정
fun changeValue() {
_data.value = "World"
}
}
텍스트 변경은 버튼 클릭시
setContent {
// Compose 안에서 뷰모델 사용
val viewModel = viewModel<MainViewModel>()
Column (
modifier = Modifier.fillMaxSize(),
verticalArrangement = Arrangement.Center,
horizontalAlignment = Alignment.CenterHorizontally,
) {
Text(
viewModel.data.value,
fontSize = 30.sp,
)
Button(onClick = {
viewModel.changeValue()
}) {
Text("변경")
}
}
}
viewModel의 데이터 수정 메서드를 가져온다
'개발일지' 카테고리의 다른 글
[Git] Git 협업 - Branch, Issue, Project, Code Review, WebHook (0) | 2023.07.22 |
---|---|
[Kotlin] Compose 입문 #5 - State 심화 (0) | 2023.06.24 |
[Kotlin] Compose 입문 #3 - Navigation, 화면 전환, 값 넘겨주기 (0) | 2023.06.22 |
[Kotlin] Compose 입문 #2 - Image, Card, Scaffold, TextField, 구조분해, 코루틴 스코프 (0) | 2023.06.21 |
[Kotlin] Compose 입문 #1 - Column, Row, 컴포저블, 리스트 (0) | 2023.06.20 |