gpt4 book ai didi

android-jetpack-compose - LaunchedEffect 在配置更改时执行,即使 rememberUpdatedState 没有更改

转载 作者:行者123 更新时间:2023-12-05 05:59:49 24 4
gpt4 key购买 nike

如果我对文档的理解正确,则在 rememberUpdatedState 未更改的情况下,LaunchedEffect 不应再次运行。

如果我运行类似下面这段代码的代码,那么它不会按预期工作,并且值会在轮换时再次更新。

如果没有 LaunchedEffect,rememberSaveable 会在配置更改时被记住,并且输入中的文本是正确的(如果我键入内容,它仍然存在)。这让我相信 rememberUpdatedState 也不应该改变但它被触发了。为什么?

我做错了什么或者这是一个错误?或者有更好的方法吗?

谢谢:)

@Composable
fun ThingView(
thingViewModel: ThingViewModel,
id: String?
) {
var thingName by rememberSaveable { mutableStateOf("") }
val scope = rememberCoroutineScope()

LaunchedEffect(rememberUpdatedState(newValue = thingName)) {
scope.launch {
id?.let {
val thing = thingViewModel.getThing(id)
thingName = thing.name
}
}
}

OutlinedTextField(
value = thingName,
onValueChange = { thingName = it },
label = { Text("Name") }
)
}

编辑:

澄清一下,目标是允许用户在 textField 中输入文本,而不是在旋转时清除该文本。这对用户来说会非常烦人,而且可能不是他们所期望的。

最佳答案

我认为您看到的是 LaunchedEffect 状态在配置更改时在旋转时被清除。因此,我认为您无法提供任何值作为阻止其运行的 key 。

我想到了两个选项。按照原始代码的样式,您可能会考虑仅在确定状态已更改时才声明 LaunchedEffect。例如,您可能会在一个可保存的文件中维护最后一次看到的 id,比如 lastId,并在输入时测试更改。当然,它最初要求您为 lastId 设置一个标记值。

@Composable
fun ThingView(
thingViewModel: ThingViewModel,
id: String?
) {
var thingName by rememberSaveable { mutableStateOf("") }
var lastId: String? by rememberSaveable { mutableStateOf(null) }
val scope = rememberCoroutineScope()

if (lastId != id) {
lastId = id
LaunchedEffect(id) {
scope.launch {
id?.let {
val thing = thingViewModel.getThing(id)
thingName = thing.name
}
}
}
}

OutlinedTextField(
value = thingName,
onValueChange = { thingName = it },
label = { Text("Name") }
)
}

另一个可能更传统的选择是使用 ViewModel 在配置更改时保持状态。您可以在每个 onValueChange 上更新 ViewModel,并让 ViewModel 将当前值提供回 OutlinedTextField。在这种风格中,您可能不需要效果或协程。

关于我对rememberUpdatedState 的理解,最后说一下。我认为它通常旨在允许长期协程或回调在可组合范围内引用变量的当前值,而无需在每次状态更改时重新创建协程或回调。闭包似乎限定了效果,它捕获了创建时的值。我仍在努力更好地理解它。

关于android-jetpack-compose - LaunchedEffect 在配置更改时执行,即使 rememberUpdatedState 没有更改,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67944899/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com