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

Jetpack Compose为何点击触发无限重组,初始运行却不触发?

问题解答

核心原因很明确:Compose在首次组合阶段的状态变更不会触发重组,只有组合完成后,状态变更才会触发重组。

首次启动时的流程

应用刚运行,Compose首次执行BadComposable:

  1. 通过remember创建count状态,初始值为0。
  2. 依次渲染Button和显示0的Text。
  3. 执行最后的count++,把count改成1。但此时Compose还没完成这个Composable的首次组合流程,尚未建立状态与重组的监听关联,所以这次状态变更不会触发重组。首次组合结束后,界面显示的count是1,但不会再触发重组。

点击按钮后的流程

点击按钮触发onClick里的count++后:

  1. count值从1变成2,此时Compose已经完成了首次组合,状态的变更会立即触发BadComposable重组。
  2. 重组过程中,代码会再次执行到最后的count++,把count改成3,这一次状态变更又会触发新一轮重组。
  3. 如此循环:每一次重组都会修改状态,状态修改又会触发下一次重组,最终形成无限重复的重组。
@Composable
fun BadComposable() {
    var count by remember { mutableStateOf(0) }

    Button(onClick = { count++ }, Modifier.wrapContentSize()) {
        Text("Recompose")
    }

    Text("$count")
    count++
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.22 04:52:03