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
相关产品推荐
相关产品推荐

