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

Jetpack Compose使用Navigation Components跳转时onCreate多次触发如何解决

问题根因与解决方案

核心问题

你看到的生命周期回调多次触发,本质不是onCreate真的执行了5-6次,而是你在Composable函数中直接注册生命周期观察者,没有和Compose的重组周期绑定:每次Composable发生重组,就会新增一个生命周期观察者,后续生命周期事件触发时,所有已注册的观察者都会同时打印日志,就出现了多次回调的假象。

修复步骤

1. 用DisposableEffect托管生命周期观察者注册逻辑

将观察者的注册、移除逻辑放到DisposableEffect中,保证每次重组不会重复添加观察者,且Composable从Composition中移除时自动解绑观察者,避免内存泄漏。
修正后的HomeScreen代码如下:

fun HomeScreen(viewModel: HomeViewModel) {
    val lifecycleOwner = LocalLifecycleOwner.current
    DisposableEffect(lifecycleOwner) {
        val observer = LifecycleEventObserver { _, event ->
            Timber.d(event.name)
        }
        lifecycleOwner.lifecycle.addObserver(observer)
        onDispose {
            lifecycleOwner.lifecycle.removeObserver(observer)
        }
    }
    // 剩余页面逻辑
}

2. 排查其他触发重组的原因

  • 检查你的rememberAppStateHolder实现,确认shouldShowBottomBar、scaffoldState等状态没有无意义的频繁更新,否则会触发Scaffold整体重组,连带NavHost和页面内容重复重组。
  • 确认你使用的Navigation Compose版本为稳定版,早期alpha/beta版本存在导航时页面意外重组的已知问题,建议升级到2.5.0及以上的正式版本。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.03 02:09:02