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

为什么Jetpack Compose的navigation composable会被调用两次?

关于Navigation composable初始调用两次的原因说明

你遇到的断点命中两次、i最终为2的情况属于Jetpack Compose Navigation的正常初始化行为,核心原因如下:

  • NavHost加载起始目的地startDestination的过程分为两步:第一步是首次布局时直接渲染目标composable完成初始绘制,第二步是Navigation组件完成导航栈状态同步后,触发一次目标composable的重组,因此你定义的s1对应的composable块会执行两次。
  • 你代码中直接在setContent块中定义的普通变量var i: Int = 0没有使用remember等状态API包裹,不属于Compose的可记忆状态,两次composable执行时都会对同一个变量做累加,最终就会得到i=2的结果。

注意事项

  • 不要用普通变量在composable作用域内做计数、存状态的操作,Compose重组时普通变量会被重新初始化,状态不会被保留。如果需要在composable生命周期内保留状态,请使用remember包裹状态变量,示例如下:
// 记住状态,重组时不会被重置
val i = remember { mutableIntStateOf(0) }
composable("s1") {
    i.intValue++
    Text("${i.intValue}")
}
  • 无需对初始两次调用做额外处理,这是Navigation组件的正常逻辑,只要正确使用Compose状态API,不会对业务逻辑产生影响。

内容的提问来源于stack exchange,提问作者Сергей

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 13:45:03