Row에Text하나가 들어 있는 상태를 만들어주자@Composable fun CheckBoxEx() { Row(verticalAlignment = Alignment.CenterVertically) { Text(text = "프로그래머입니까?") } }
checked속성은 false,onCheckedChange는 비워두자@Composable fun CheckBoxEx() { Row(verticalAlignment = Alignment.CenterVertically) { Checkbox(checked = false, onCheckedChange = {} ) Text(text = "프로그래머입니까?") } }
일반적인 안드로이드의 레거시 뷰하고는 좀 다른점이 있다
레거시뷰는 코드를 넣지않아도 동작을 하지만 jetpackcompose는 그렇게 되어있지 않고
체크박스에 false가 되어있기에 클릭을 해도 check가 되지를 않는다
onCheckedChange에서 boolean 값 변수를 바꾸고 checked에서 그 값을 반영해보자@Composable fun CheckBoxEx() { Row(verticalAlignment = Alignment.CenterVertically) { var checked = false Checkbox(checked = checked, onCheckedChange = { checked = !checked } ) Text(text = "프로그래머입니까?") } }에뮬레이터를 키고 동작을 해보면 되지 않는 것을 알 수가 있다.
??
그 이유는 checked 변수가 상태값이 아니기 때문이다.
Composalbe은 언제든지 다시 그려질 수 있고, 중단 되거나, 사라질 수 있다고 생각을 해야한다.
그렇기에 상태값으로 지정을 해놓아야한다.
여기서 끝나는 것이 아니라 상태값을 지정을 해놓더라도 기본적으로 Composable은 어떠한 상태값이 바뀌게 되면 재구성이 일어나게 된다.
재구성이 일어나기때문에 Remeber를 통해서 상태를 기억했다가 나중에 사용할 수 있게 해야한다.
mutableStateOf를 통해서 상태값을 저장할 수 있고remember를 통해 상태값을 기억할 수 있다.
valueproperty를 이용해서 상태값에 접근할 수 있다.@Composable fun CheckBoxEx() { Row(verticalAlignment = Alignment.CenterVertically) { var checked = remember { mutableStateOf(false) } Checkbox(checked = checked.value, onCheckedChange = { checked.value = !checked.value } ) Text(text = "프로그래머입니까?") } }
그런데 이렇게 계속 value를 써줘야 하는 것이 불편하다.
안사용할 수 있는 방법이 있다.
delegated properties라고 하면위임한다고 생각하면된다
by라는 키워드를 사용하여 getter,setter,를 위임한다고 생각하면 된다.
이때 반드시 var로 선언을 해야한다.@Composable fun CheckBoxEx() { Row(verticalAlignment = Alignment.CenterVertically) { var checked by remember { mutableStateOf(false) } Checkbox(checked = checked, onCheckedChange = { checked = !checked } ) Text(text = "프로그래머입니까?") } }
동일하게 동작하는 것을 확인할 수 있다.
위임을 통해서도 할 수 있지만 destruction 즉 비구조화를 통해서도 할 수 있다.
mutableStateOf의 문서를 보면getter와setter가 있다.
이 구조화되어있는getter와setter를 따로 분리 시켜준다고 생각하면 된다.
코드로 한번 보면 이해가 될것이다.@Composable fun CheckBoxEx() { Row(verticalAlignment = Alignment.CenterVertically) { val (checked, setChecked) = remember { mutableStateOf(false) } Checkbox(checked = checked, onCheckedChange = { setChecked(it) } ) Text(text = "프로그래머입니까?") } }
@Composable
fun CheckBoxEx() {
Row(verticalAlignment = Alignment.CenterVertically) {
val (checked, setChecked) = remember { mutableStateOf(false) }
Checkbox(checked = checked, onCheckedChange = setChecked)
Text(text = "프로그래머입니까?",modifier = Modifier.clickable{
setChecked(!checked)
})
}
}

Text에 modifier에 clickable을 활용하여 setChecked를 사용하면 된다
처음 Compose를 공부하다보니 CheckBox를 공부하면서 당연히 될줄 알았던 값 변경이 안되어서 난관이 있었다.
그와 관련된 공부를 또 하다보니 Remember, state, composable의 재구성 등을 알게 되었다.
이번 포스트와 같이 해당 UI를 사용하면서 같이 사용하게 되는 개념이 있으면 같이 올려보려고 한다
파고파고 들어가서 공부해보고 적용해보는 것에 재미를 더 느꼈다
jetpack compose 연습 깃헙 링크
https://github.com/unso99/jetpack_compose_practice