Jetpack Compose中derivedStateOf在条件逻辑中失效问题
为什么使用derivedStateOf时浮点数值不更新,直接用条件逻辑却正常?
我实现了一个计数器Compose函数,想根据计数器值切换浮点数值。用derivedStateOf实现时,浮点数值始终不变;但直接写条件逻辑却能正常更新。
问题代码(浮点值不更新)
@Preview(showBackground = true) @Composable fun Experiment() { Surface { var count by remember { mutableStateOf(0) } ExperimentView(count) { count++ } } } @Composable fun ExperimentView(count: Int, onCountChange: () -> Unit) { Column { val floatValue by remember { derivedStateOf { if (count % 2 == 0) { 0.4F } else { 0.2F } } } Text(text = "$count with float value $floatValue") Spacer(modifier = Modifier.height(20.dp)) Button(onClick = { onCountChange() }) { Text(text = "Button") } } }
正常工作的代码
@Composable fun ExperimentView(count: Int, onCountChange: () -> Unit) { Column { val floatValue = if (count % 2 == 0) { 0.4F } else { 0.2F } Text(text = "$count with float value $floatValue") Spacer(modifier = Modifier.height(20.dp)) Button(onClick = { onCountChange() }) { Text(text = "Button") } } }
原因分析
问题出在remember的使用上:
- 用
remember包裹derivedStateOf时,没有传入count作为依赖键。remember默认会缓存创建的derivedStateOf实例,当count变化时,remember因为没感知到依赖更新,不会重新生成新的derivedStateOf,导致内部的计算lambda永远不会重新执行,浮点值一直停留在初始计算结果。 - 直接写条件逻辑时,每次
count变化触发Compose重组,都会重新执行这段条件判断,自然能得到最新的浮点值。
修复方法
给remember加上count作为依赖键,让count变化时重新创建derivedStateOf:
val floatValue by remember(count) { derivedStateOf { if (count % 2 == 0) { 0.4F } else { 0.2F } } }
内容的提问来源于stack exchange,提问作者Compose Learner
相关产品推荐
相关产品推荐

