为什么Jetpack Compose的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,提问作者Сергей
相关产品推荐
相关产品推荐

