Compose는 선언적이므로 Compose를 업데이트하는 유일한 방법은 새 변수로 동일한 컴포저블을 호출하는 것입니다. 이러한 변수는 UI 상태를 표현합니다. 상태가 업데이트될 때마다 재구성됩니다.
TextField
와 같은 항목은 명령형 XML 기반 뷰에서처럼 자동으로 업데이트되지 않습니다.
컴포저블이 새 상태에 따라 업데이트되려면 새 상태를 명시적으로 알려야 합니다.
@Composable
fun HelloContent() {
Column(modifier = Modifier.padding(16.dp)) {
Text(
text = "Hello!",
modifier = Modifier.padding(bottom = 8.dp),
style = MaterialTheme.typography.h5
)
OutlinedTextField(
value = "",
onValueChange = { },
label = { Text("Name") }
)
}
}
이 코드를 실행하면 아무 일도 일어나지 않습니다. TextField
가 자체적으로 업데이트되지 않기 때문입니다. value
매개변수가 변경될 때 업데이트됩니다. 이는 Compose에서의 컴포지션 및 리컴포지션 작동 방식 때문입니다.
핵심 용어: 컴포지션: Jetpack Compose가 컴포저블을 실행할 때 빌드한 UI에 관한 설명
초기 컴포지션: 처음 컴포저블을 실행하여 컴포지션을 만듭니다.
재구성: 데이터가 변경될 때 컴포지션을 업데이트하기 위해 컴포저블을 다시 실행하는 것을 말합니다.
컴포저블 함수는 컴포저블을 사용하여 메모리에 단일 객체를 저장할 수 있습니다 remember
에 의해 계산된 값 remember
은 초기 합성 시 컴포지션에 저장되고 저장된 값은 재구성 중에 반환됩니다. remember
가변 객체와 불변 객체를 모두 저장하는 데 사용할 수 있습니다.
remember는 이전의 값을 기억하고 있습니다.
화면 재구성을 위한 calculation시 remember값이 호출됩니다.
remember는 이전의 값을 기억하고 있다가 calculation시 값을 비교 후 같다면 그대로, 다르다면 새로운 값을 생성하고 기억합니다.
참고: 개체를 컴포지션에 저장하고 호출한 컴포저블 이 컴포지션에서 제거 되면 개체를 잊어버립니다 .
mutableStateOf
interface MutableState<T> : State<T> {
override var value: T
}
변경 사항 value
는 읽을수 있는 함수의 재구성을 예약합니다 value
의 경우 ExpandingCard
메서드가 실행될 때마다 재구성됩니다
MutableState
컴포저블에서 상태를 관리해야 하는 객체를 선언하는 방법에는 세 가지가 있습니다 .
val mutableState = remember { mutableStateOf(default) }
var value by remember { mutableStateOf(default) }
val (value, setValue) = remember { mutableStateOf(default) }
이러한 선언은 동일하며 다양한 상태 사용을 위한 구문 설탕으로 제공됩니다.
작성 중인 컴포저블에서 가장 읽기 쉬운 코드를 생성하는 코드를 선택하면 됩니다.
by
위임 구문에는 다음 import가 필요합니다 .
import androidx.compose.runtime.getValue
import androidx.compose.runtime.setValue
기억된 값을 다른 컴포저블에 대한 매개변수로 사용하거나 표시되는 컴포저블을 변경하기 위해 사용할 수도 있습니다. 예를 들어 이름이 비어 있는 경우 인사말을 표시하지 않으려면 if
문에서 State를 사용합니다.
@Composable
fun HelloContent() {
Column(modifier = Modifier.padding(16.dp)) {
var name by remember { mutableStateOf("") }
if (name.isNotEmpty()) {
Text(
text = "Hello, $name!",
modifier = Modifier.padding(bottom = 8.dp),
style = MaterialTheme.typography.h5
)
}
OutlinedTextField(
value = name,
onValueChange = { name = it },
label = { Text("Name") }
)
}
}
Jetpack Compose에서는 상태를 보존하기 위해 MutableState<T>
를 사용할 필요가 없습니다. Jetpack Compose는 관찰 가능한 다른 유형을 지원합니다.
Jetpack Compose에서 관찰 가능한 다른 유형을 읽으려면 상태를 State<T>
로 변환해야 합니다.
그래야 상태가 변할 때 Jetpack Compose가 자동으로 재구성됩니다.
Compose에는 Android 앱에 사용되는 관찰 가능한 일반 유형에서 State<T>
를 만들 수 있는 함수가 내장되어 있습니다.
앱에 관찰 가능한 맞춤 클래스를 사용하는 경우 관찰 가능한 다른 유형을 읽어오기 위한 Jetpack Compose용 확장 함수를 빌드할 수 있습니다.
모든 변경사항을 수신하도록 Jetpack Compose에 허용하는 모든 객체를 State<T>
로 변환하고 컴포저블을 통해 읽어올 수 있습니다.
요점: Compose는 State<T>
객체를 읽어오면서 자동으로 재구성됩니다.
Compose에서 LiveData
같은 관찰 가능한 또 다른 유형을 사용할 경우 컴포저블에서 LiveData<T>.observeAsState()
같은 구성 가능한 확장 함수를 사용하여 그 유형을 읽어오려면 유형을 State<T>
로 변환해야 합니다.