Jetpack Compose中Nav Host使用Deep Links跳转失效问题求助
问题修复方案
1. 修正Activity启动模式并处理Intent传递
你当前配置的launchMode="singleInstance"会导致新的DeepLink Intent无法正常传递给已启动的Activity,首先推荐将启动模式修改为singleTop。如果必须保留singleInstance配置,需要主动处理两种场景下的Intent:
- 在
onCreate中NavController初始化后,首次处理传入的Intent - 重写
onNewIntent方法,处理应用已在后台运行时传入的新Intent
// MainActivity.kt override fun onNewIntent(intent: Intent?) { super.onNewIntent(intent) // 手动将新的DeepLink Intent传递给导航控制器 navController.handleDeepLink(intent) } // onCreate方法中补充逻辑 override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContent { val navController = rememberNavController() // 首次启动时处理DeepLink LaunchedEffect(Unit) { if (savedInstanceState == null) { navController.handleDeepLink(intent) } } // 原有NavHost逻辑不变 NavHost(navController = navController, startDestination = "mainView") { // ... 原有导航配置 } } }
navController.handleDeepLink(intent)是触发DeepLink自动跳转的核心调用,必须确保两种场景都覆盖
2. 补全DeepLink匹配规则
你在Manifest中声明了xkcd.com和www.xkcd.com两个域名,但导航配置中只适配了带www前缀的域名,需要把不带前缀的域名也加入DeepLink列表,同时兼容链接末尾带/和不带/的场景:
val rootUri = "https://www.xkcd.com" val rootUriWithoutWww = "https://xkcd.com" NavHost(navController = navController, startDestination = "mainView") { composable( "mainView", deepLinks = listOf( navDeepLink { uriPattern = rootUriWithoutWww }, navDeepLink { uriPattern = rootUri } ) ) { MainContent() } composable( route = "singleView/{number}", arguments = listOf(navArgument("number") { type = NavType.IntType }), deepLinks = listOf( // 末尾/?兼容链接带/和不带/的两种情况 navDeepLink { uriPattern = "$rootUriWithoutWww/{number}/?" }, navDeepLink { uriPattern = "$rootUri/{number}/?" } ) ) { backStackEntry -> val number = backStackEntry.arguments?.getInt("number") SingleView(number) } }
3. 移除多余Manifest配置
如果不需要跨任务栈唤起App,可移除android:allowTaskReparenting="true"配置,避免任务栈异常导致的导航跳转失败。
4. 检查依赖版本
如果以上配置都正确仍然无法跳转,升级你的androidx.navigation:navigation-compose依赖到2.5.0及以上稳定版本,低版本存在DeepLink匹配异常的已知bug。
内容的提问来源于stack exchange,提问作者Mr. Pine
相关产品推荐
相关产品推荐

