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

Android Compose Navigation传参为空且返回直接退出应用问题咨询

问题根因

你遇到的两个问题核心原因完全一致:AdrestoApplication 中错误地将动态计算的 currentRoute 作为 startDestination 在每次重组时传入 NavHost,导致导航栈被反复重置。
NavHost 的 startDestination 仅用于导航图首次初始化,后续重组时如果传入新值,会直接清空现有回退栈,以新路由作为唯一根页面重建导航图:

  • 跳转详情页后触发重组,导航栈被重置为仅保留详情页,因此系统返回键直接退出应用,无回退栈
  • 重建导航图时直接以详情页作为根页面启动,没有携带跳转时传入的 listingId 参数,因此取到Long类型默认值0

解决方案

第一步:修复AdrestoApplication逻辑

startDestination 仅需在导航图初始化时确定一次,不要动态修改,将动态计算逻辑替换为仅首次判断:

@Composable
fun AdrestoApplication() {
    val authViewModel = hiltViewModel<AuthViewModel>()
    val navController = rememberNavController()
    // 用remember包裹仅首次计算初始路由,避免每次重组更新
    val initialRoute = remember {
        if (authViewModel.isLoggedIn()) Destinations.LISTINGS_LIST else Destinations.LOGIN_ROUTE
    }

    AdrestoTheme {
        NavGraph(
            navController = navController,
            startDestination = initialRoute,
        )
    }
}

第二步:可选优化(避免路由拼写错误)

跳转时直接复用已定义的常量构造路由,减少手写错误概率:

onCardClick = {
    val route = Destinations.LISTING_DETAILS.replace("{listingId}", listing.id.toString())
    navController.navigate(route)
}

补充说明

如果需要实现登录成功后移除登录页回退栈的需求,在登录成功的跳转逻辑中使用以下写法即可,不需要修改NavHost的startDestination:

navController.navigate(Destinations.LISTINGS_LIST) {
    popUpTo(Destinations.LOGIN_ROUTE) {
        inclusive = true
    }
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 18:48:00