记住可组合状态,即使在重组期间未调用调用remember的代码位置

问题描述 投票:0回答:1

即使在重组期间未触发包含“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,但没有成功。

android-jetpack-compose android-jetpack
1个回答
0
投票

总体思路是将状态提升到撰写树中更高的位置。这通常意味着将状态放置在调用当前可组合项的可组合项中,并将状态值作为参数传递。但是,在您的具体情况下,只需将其向上移动一行即可将其从 if

 中取出:

var count by remember { mutableStateOf(0) } var showTask by remember { mutableStateOf(true) } if (count > 0) { if (showTask) { WellnessTaskItem(...) } Text(...) }
这样状态将永远不会离开组合树,因此在重组期间该值不会丢失。

最新问题
© www.soinside.com 2019 - 2024. All rights reserved.