Compose를 공부하면서 처음 선언형 UI의 특징인 상태에 대하여 처음 접하게 되었습니다.
Compose를 잘 이해하려면 상태를 명확하게 이해해야 한다. 판단해 블로그에 기록하도록 하겠습니다.
상태는 시간에 따라 변경될 수 있는 값
입니다. 시간에 따라 변경이 될 수 있다는 말은 APP이 시간이 흐르면서 특정 이벤트가 발생했을 때 변하는 데이터를 의미합니다.
공식 문서 예시를 살펴보면 와이파이가 연결이 되어 있는 상태
였다가 연결이 끊어진 상태
로 변하면 사용자에게 스낵바로 사용자에게 알려줘 상태가 변하면 UI가 어떻게 변하는지 보여주는 예시가 저는 가장 이해가 잘 되었던거 같습니다.
재구성은 컴포저블 함수의 계층 안에서 상태값이 변경이 되었을 때 일어나는데 상태의 변화를 감지하면 해당 상탯값의 변화에 영향을 받는 모든 함수를 재구성해 새로운 상탯값을 전달한다.
그러니깐 체크박스 예시로 들면 체크 여부에 따라서 on/off 상태에 따라 변화가 일어나서 UI를 자동으로 업데이트 되는 메커니즘입니다.
@Composable
fun StatefulTextField() {
var text by remember { mutableStateOf("") }
Column {
TextField(
value = text,
onValueChange = { newText ->
text = newText
},
label = { Text(text = "입력") }
)
Text(text = "출력 : $text")
}
}
MutableState
객체로 해당 값을 감싸줘야 합니다.remember
키워드를 이용한다.by
위임 키워드를 통해 상태 선언을 간결하게 하여 값을 쉽게 관리할 수 있다.TextField
컴포저블에서 onValueChange
함수가 사용자가 글을 입력하고 수정할 때마다 onValueChange
가 실행되어 람다 함수 매개변수를 통해 text에 저장되어 UI가 자동으로 갱신합니다.hoisting
이란 영어사전에서 뜻을 보면 끌어 올리기, 들어올려 나르기
라는 의미를 가진다.
Compose에서 상태 호이스팅은 상태를 자식 컴포저블에서 이를 호출한 부모 컴포저블로 끌어 올린라는 의미를 가진다.
결과적으로 자식 컴포저블이 비상태 컴포저블로 만들어지면 재사용성이 향상되어 좀 더 유연하게 코딩이 가능해지고 테스트가 쉬워지는 장점
이 있습니다.
@Composable
fun StatelessTextField(
text: String,
onTextChanged: (String) -> Unit
) {
Column {
TextField(
value = text,
onValueChange = onTextChanged,
label = { Text(text = "입력") }
)
Text(text = "출력 : $text")
}
}
text, onTextChanged
텍스트 변경을 부모 컴포저블로 전달하기 위해 매개변수를 받습니다. var text by remember {
mutableStateOf("")
}
StatelessTextField(
text = text,
onTextChanged = { newText -> text = newText })
}
text
를 초기화 합니다.https://developer.android.com/develop/ui/compose/state?hl=ko
https://moondev03.tistory.com/entry/Compose-State-Hoisting
https://kotlinworld.com/244
핵심만 골라 배우는 젯팩 컴포즈