class MyClass {
companion object {
var counter = 1
fun counterUp() {
counter += 1
}
}
}
fun main(args: Array<String>) {
println(MyClass.counter) // 1
MyClass.counterUp()
println(MyClass.counter) // 2
}
컴포즈와 같은 선언적 언어에서 일반적으로 상태란 '시간에 따라 변경될 수 있는 값'이라 불린다.
컴포즈를 이용해 개발할 때는 컴포저블 함수의 계층을 생성해 앱을 구축한다.
한 컴포저블 함수에서 다른 함수로 전달된 데이터는 대부분 부모 함수에서 상태로서 선언된다. 즉, 부모 컴포저블의 상탯값 변화가 모든 자식 컴포저블에 반영되며, 해당 상태가 전달된다는 것을 의미한다. 컴포즈에서 이를 재구성이라는 동작으로 실행한다.
재구성은 컴포저블 함수의 계층 안에서 상탯값이 변경될 때 일어난다. 컴포즈는 상태의 변화가 감지되면 영향을 받는 모든 함수를 재구성한다. 재구성이란 해당 함수들을 다시 호출하고 새로운 상탯값을 전달하는 것이다.
상탯값이 변경될 때마다 사용자 인터페이스의 전체 컴포저블 트리를 재구성하면 사용자 인터페이스의 렌더링과 업데이트에 있어 비효율적이다. 컴포즈는 해당 상태 변화에 직접 영향을 받는 함수들만 재구성하는 지능적 재구성 기법을 이용해 이 오버헤드를 피한다. 즉, 해당 상탯값을 읽는 함수들만 재구성하는 것이다.
var textState = { mutableStateOf("") }
var myState = remember { mutableStateOf("") }
@Composable
fun MyTextField() {
var textState = remember { mutableStateOf("") }
val onTextChange = {text: String ->
textState.value = text
}
TextField(
value = textState.value,
onValueChange = onTextChange
)
}
import androidx.compose.runtime.getValue
import androidx.compose.runtime.setValue
@Composable
fun MyTextField() {
var textState by remember { mutableStateOf("") }
val onTextChange = {text: String ->
textState = text
}
TextField(
value = textState,
onValueChange = onTextChange
)
}
@Composable
fun FunctionA() {
var switchState by remember {mutableStateOf(true)}
val onSwitchChange = {value: Boolean ->
switchState = value
}
FunctionB(switchState, onSwitchChange)
}
@Composable
fun FunctionB(switchState: Boolean, onSwitchChange: (Boolean) -> Unit) {
Switch(
checked = switchState,
onCheckedChange = onSwitchChange
)
}
@Preview(showBackground = true)
@Composable
fun DefaultPreview() {
StateExampleTheme {
Column{
DemoScreen()
FunctionA()
}
}
}
@Composable
fun DemoScreen() {
var textState by remember { mutableStateOf("") }
val onTextChange = { text: String ->
textState = text
}
MyTextField(text: String, onTextChange: (String -> Unit))
}
@Composable
fun MyTextField(text: String, onTextChange: (String) -> Unit) {
TextField(
value = text,
onValueChange = onTextChange
)
}