Jetpack Compose TextField не обновляется при вводе нового символа
Я следил за этим документом с сайта разработчика. Я хочу отобразить текст из пользовательского ввода и сохранить изменения конфигурации.
В приведенном ниже коде, когда пользователь вводит текст с клавиатуры,OutlinedTextField
не обновляет текст.
Однако эта строка кода работает правильно:
HelloContent(name = temp, onNameChange = { temp = it})//Work
Ниже приведен код, который я использую для реализации:
@Composable
fun HelloScreen() {
var city by rememberSaveable(stateSaver = CitySaver) {
mutableStateOf(City("Hanoi","VietNam"))
}
var temp by rememberSaveable {
mutableStateOf("")
}
Column {
HelloContent(name = city.name, onNameChange = { city.name = it})//Doesn't work
HelloContent(name = temp, onNameChange = { temp = it})//Work
}
}
@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") }
)
}
}
data class City(var name: String, val country: String)
val CitySaver = run {
val nameKey = "Name"
val countryKey = "Country"
mapSaver(save = {mapOf(nameKey to it.name,countryKey to it.country)},
restore = {City(it[nameKey] as String,it[countryKey] as String)})
}
Не могли бы вы помочь мне исправить первый блок кода для работы?
HelloContent(name = city.name, onNameChange = { city.name = it})//Doesn't work
1 ответ
Не будет обновляться, потому что вы только изменяетеcity.name
не фактическое mutableState City
объект, так что нет ничего, что говоритcomposer
для запуска обновления ().
Итак, измените свой первыйHelloContent
компонуется вот так.
HelloContent(name = city.name, onNameChange = { city = city.copy(name = it)})
изменение этой строки
onNameChange = { city.name = it}
к этому
onNameChange = { city = city.copy(name = it)}
убедитесь, что вашTextField
обновляется(re-composed
).
Имейте в виду, призывая.copy()
на классах данных гарантирует, что будет создан новый экземпляр (при условии, что вы указали новое значение для одного из его свойств/полей), что необходимо дляCompose
для запускаre-composition
.