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

Jetpack Compose中remember疑问:点击按钮后foo重组为何x始终为2?

问题原因解析

1. remember的核心行为:仅保留初始化值

foo()里的var x = remember { 1 }中,remember的初始化lambda只会在首次组合时执行一次,后续每次重组时,remember直接返回这个lambda的执行结果(也就是初始值1),并不会保存x后续修改后的数值。

所以每次foo()重组时,x都会被重新赋值为1,接着执行x += 1,最终x的值永远停留在2。

2. 普通变量无法被Compose重组系统追踪

就算你想让x的变化触发额外重组,这里的x是普通Int变量,而非MutableState类型,Compose的重组系统无法感知它的变化。不过在这个案例里,核心问题是每次重组时x都会被重置,和追踪逻辑无关。

3. foo()重组的触发逻辑

点击按钮时,MainScreen中的state(MutableState类型)发生变化,触发MainScreen整体重组,作为子可组合函数的foo()也会跟着重组。但如前所述,每次重组时x都会被重置后加1,所以始终显示2。

如果想让x在每次重组时持续递增,需要将x声明为MutableState,让remember保存状态容器而非固定值:

@Composable
fun foo() {
    var x by remember { mutableStateOf(1) }
    x += 1
    Text("$x")
}

这样每次重组时,x会基于之前保存的状态值递增,显示的数字会随重组次数持续增加。


内容的提问来源于stack exchange,提问作者hamid Mahmoodi

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.24 22:17:14