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
相关产品推荐
相关产品推荐

