Jetpack Compose为何点击触发无限重组,初始运行却不触发?
问题解答
核心原因很明确:Compose在首次组合阶段的状态变更不会触发重组,只有组合完成后,状态变更才会触发重组。
首次启动时的流程
应用刚运行,Compose首次执行BadComposable:
- 通过
remember创建count状态,初始值为0。 - 依次渲染
Button和显示0的Text。 - 执行最后的
count++,把count改成1。但此时Compose还没完成这个Composable的首次组合流程,尚未建立状态与重组的监听关联,所以这次状态变更不会触发重组。首次组合结束后,界面显示的count是1,但不会再触发重组。
点击按钮后的流程
点击按钮触发onClick里的count++后:
count值从1变成2,此时Compose已经完成了首次组合,状态的变更会立即触发BadComposable重组。- 重组过程中,代码会再次执行到最后的
count++,把count改成3,这一次状态变更又会触发新一轮重组。 - 如此循环:每一次重组都会修改状态,状态修改又会触发下一次重组,最终形成无限重复的重组。
@Composable fun BadComposable() { var count by remember { mutableStateOf(0) } Button(onClick = { count++ }, Modifier.wrapContentSize()) { Text("Recompose") } Text("$count") count++ }
内容的提问来源于stack exchange,提问作者bqliang
相关产品推荐
相关产品推荐

