即使在重组期间未触发包含“remember”语句的代码的调用,我们如何确保可组合函数中状态的持久保留?考虑到给定的场景,尽管单击“清水计数”按钮后“计数”重置为零,但维持“showTask”状态(将其设置为 false 后)的正确方法是什么?
@Composable
fun WaterCounter(modifier: Modifier = Modifier) {
Column(modifier = modifier.padding(16.dp)) {
var count by remember { mutableStateOf(0) }
if (count > 0) {
var showTask by remember { mutableStateOf(true) }
if (showTask) {
WellnessTaskItem(
onClose = { showTask = false },
taskName = "Have you taken your 15 minute walk today?"
)
}
Text("You've had $count glasses.")
}
Row(Modifier.padding(top = 8.dp)) {
Button(onClick = { count++ }, enabled = count < 10) { Text("Add one") }
Button(onClick = { count = 0 }, Modifier.padding(start = 8.dp)) {
Text("Clear water count")
}
}
}
}
尝试使用rememberSaveable,但没有成功。
总体思路是将状态提升到撰写树中更高的位置。这通常意味着将状态放置在调用当前可组合项的可组合项中,并将状态值作为参数传递。但是,在您的具体情况下,只需将其向上移动一行即可将其从 if
中取出:
var count by remember { mutableStateOf(0) }
var showTask by remember { mutableStateOf(true) }
if (count > 0) {
if (showTask) {
WellnessTaskItem(...)
}
Text(...)
}
这样状态将永远不会离开组合树,因此在重组期间该值不会丢失。