You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.06 01:09:51