我从开发人员站点跟踪了this document个. 我希望显示来自用户输入的OutlinedTextField中的文本,并使其在配置更改后仍然有效.

使用下面的代码,当用户从键盘输入文本时,OutlinedTextField不会更新文本.

HelloContent(name = city.name, onNameChange = { city.name = it})//Doesn't work

enter image description here

但是,下面这行代码可以正常工作:

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

推荐答案

TextField不会被更新,因为您只修改了city.name而不是实际的mutableState City对象,所以没有任何东西告诉composer触发更新(re-composition).

所以像这样修改你的第一个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需要该实例.

Android相关问答推荐

以正确的方式从房间收集流量

无法理解Kotlin Coroutines and Flows中的J.C.编程行为

如何在Jetpack导航中不显示目的地?

在卡片上创建圆角底部边框

如何从sqlite数据库中检索数据到碎片android?

为什么柱子的高度不都一样?

Kotlin为多个控件设置一个侦听器

是否可以附加事件处理程序,如onClick,拖动到Canvas Composable中绘制的内容,或使用drawBehind修饰符?

制作圆形SupportMapFragment

在 kotlin 上向适配器添加绑定视图功能

SQLite Kotlin 问题 - 没有数据库

当 Firebase Firestore 发生变化时,Kotlin ViewModel 不会更新

以下代码如何在 Android 上运行

是否可以在 Kotlin 中为 mutableStateOf() 设置自定义设置器

记住或不记得derivedStateOf

如何在 TextButton 中分隔文本和图标

IconButton 中可绘制的图标是黑色的,尽管它是白色的

在 jetpack compose 中使用 .shadow 和 Button 会导致问题

关于launchWhenX和repeatOnLifecycle的问题

Android Studio (Kotlin):无法启动活动