gpt4 book ai didi

kotlin - Remember in Composition 被遗忘

转载 作者:行者123 更新时间:2023-12-05 03:22:29 30 4
gpt4 key购买 nike

我在 Google CodeLabs:这是代码:

@Composable
fun WaterCounter(
modifier: Modifier = Modifier,
) {
var count by remember { mutableStateOf(0) }

Column(
modifier = modifier.padding(16.dp)
) {

if (count > 0) {
var showTask by remember { mutableStateOf(true) }
if (showTask) {
WellnessTaskItem(
taskName = "Have you taken your 15 minute walk today?",
onClose = { showTask = false })
}
Text(
text = "You've had $count glasses",
modifier = modifier.padding(16.dp)
)
}


Row(
modifier = modifier.padding(top = 8.dp)
) {
Button(
onClick = { count++ },
enabled = count < 10,
) {
Text(text = "add one")
}

Button(
onClick = { count = 0 },
modifier = modifier.padding(start = 8.dp)
) {
Text(text = "Clear water count")
}
}
}
}

我听不懂这个短语:"按 Clear water 计数按钮将count 重置为 0 并重新组合。显示count文本,以及与 WellnessTaskItem 相关的所有代码都不会被调用并离开组合。showTask 被遗忘,因为没有调用调用记住 showTask 的代码位置。“

请帮我理解为什么忘记了show task? “代码未被调用”和“它离开组合”是什么意思?

最佳答案

条件代码块在条件为真时进入组合,在条件不再为真时离开组合。当计数为零时,该 block 将被删除,下次进入组合时,请记住存储 showTasktrue 值。

例如下面的代码块

@Composable fun App() {
val result = getData()
if (result == null) {
Loading(...)
} else {
Header(result)
Body(result)
}
}

这些 block 还根据结果是否为空输入组合。进入组合意味着它是一个开始执行的节点,当在该 block 中读取的 State 更新时,会发生重组,这意味着同一 block 将更新为新值。

enter image description here

当结果为 null Loading Composable 进入组合时,假设它有一个进度条,当它增加时 Loading Composable 被重新组合。

当结果出现时 Loading Composable 退出组合

   Header(result)
Body(result)

进入组合 enter image description here

此外,可组合 block 也不一定需要与 UI 相关。例如,您可以使用 LaunchedEffect 创建一个 Composable block 来显示 SnackBar。

if (count > 0 && count <5) {
// `LaunchedEffect` will cancel and re-launch if
// `scaffoldState.snackbarHostState` changes
LaunchedEffect(scaffoldState.snackbarHostState) {
// Show snackbar using a coroutine, when the coroutine is cancelled the
// snackbar will automatically dismiss. This coroutine will cancel whenever
// if statement is false, and only start when statement is true
// (due to the above if-check), or if `scaffoldState.snackbarHostState` changes.
scaffoldState.snackbarHostState.showSnackbar("count $count")
}
}

当计数大于 0 时,此 block 将进入组合,并在计数小于 5 时保持组合,但由于它是 LaunchedEffect,它将触发一次,但如果计数达到 5 的速度快于 Snackbar 持续时间,Snackbar 将被取消,因为 block 离开组合。

您可以使用 DisposableEffect 检查 Composable 何时进入和退出组合

您可以查看这篇文章进行更深入的分析。

https://medium.com/androiddevelopers/under-the-hood-of-jetpack-compose-part-2-of-2-37b2c20c6cdd

关于kotlin - Remember in Composition 被遗忘,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/72705876/

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