Compose를 업데이트하는 유일한 방법은 새 인수로 동일한 컴포저블을 호출하는 것입니다. 이러한 인수는 UI 상태를 표현합니다. 상태가 업데이트될 때마다 재구성이 실행됩니다.
@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") }
)
}
}
하지만 TextFiled는 자동으로 업데이트가 되지 않는다
remember 컴포저블을 사용하여 메모리에 단일 객체를 저장할 수 있습니다.
remember에 계산된 값은 초기 포지션 중에
컴포지션에 저장되고 또 저장된 값을 리컴포지션 중에 반환합니다.
val 변수이름 = remember { mutableStateOf(default) } // 주로 사용
var 변수이름 by remember { mutableStateOf(default) }
val (변수이름, 받는변수이름) = remember { mutableStateOf(default) } // React형식 비슷
@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") }
)
}
}
하지만 remember 과정 전체의 상태르 유지하는데 도움이 되지만 구성 변경 전반에 상태가 유지가 되지 않는다. 이경우 rememberSaveable을 사용해야 합니다
rememberSaveable : Bundle에 저장할 수 있는 모든 값을 자동으로 저장합니다.
표시할 현재의 값
T가 제안된 새 값인 경우 값을 변경하도록 하는 요청 이벤트
@Composable
fun HelloScreen() {
var name by rememberSaveable { mutableStateOf("") }
HelloContent(name = name, onNameChange = { name = it })
}
@Composable
fun HelloContent(name: String, onNameChange: (String) -> Unit) {
Column(modifier = Modifier.padding(16.dp)) {
Text(
text = "Hello, $name",
modifier = Modifier.padding(bottom = 8.dp),
style = MaterialTheme.typography.h5
)
OutlinedTextField(
value = name,
onValueChange = onNameChange,
label = { Text("Name") }
)
}
}
상태의 저장 방식과 분리됩니다. 분리된다는 것은 HelloScreen을 수정하거나 교체할 경우 HelloContent의 구현 방식을 변경할 필요가 없다는 의미입니다.
class MainActivity : ComponentActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContent {
HelloScreen(HelloViewModel())
}
}
}
class HelloViewModel() : ViewModel() {
private val _name = MutableLiveData("")
val name: LiveData<String> = _name
fun onNameChanged(newName: String){
_name.value = newName
}
}
@Composable
fun HelloScreen(helloViewModel: HelloViewModel ) {
val name by helloViewModel.name.observeAsState("")
HelloContent(name = name, onNameChange = { helloViewModel.onNameChanged(it)})
}
@Composable
fun HelloContent(name: String, onNameChange: (String) -> Unit) {
Column(modifier = Modifier.padding(16.dp)) {
if (name.isNotEmpty()) {
Text(
text = "Hello, $name",
modifier = Modifier.padding(bottom = 8.dp),
style = MaterialTheme.typography.h5
)
}
OutlinedTextField(
value = name,
onValueChange = onNameChange,
label = { Text("Name") }
)
}
}