상태 및 컴포지션

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>로 변환해야 합니다.

profile
러닝커브를 따라서 등반중입니다.

0개의 댓글