Jetpack Compose中如何获取NavDeepLink的完整uriPattern并传递给可组合项?
解决方法
方法1:从触发的深链接URI直接解析
你可以通过NavBackStackEntry的uri属性拿到触发当前页面的完整深链接地址,再从中提取instance和完整URI:
composable( route = "c/{name}/{instance}", deepLinks = DEFAULT_LEMMY_INSTANCES.map { instance -> navDeepLink { uriPattern = "$instance/c/{name}" } }, arguments = listOf( navArgument("name") { type = NavType.StringType }, // 添加instance参数定义,预留默认值 navArgument("instance") { type = NavType.StringType defaultValue = "" } ) ) { backStackEntry -> LaunchedEffect(Unit) { val name = backStackEntry.arguments?.getString("name")!! // 获取触发页面的完整深链接URI val deepLinkUri = backStackEntry.uri // 从URI中提取instance(取域名/主机部分) val instance = deepLinkUri?.host ?: deepLinkUri?.authority ?: "" // 获取完整的触发URI字符串 val fullUriPattern = deepLinkUri?.toString() ?: "" // 这里就可以用instance和fullUriPattern来处理数据获取逻辑了 } }
方法2:调整深链接的参数配置
把instance纳入深链接的参数体系,统一路由和深链接的参数结构:
// 定义通用深链接模板 const val DEEP_LINK_TEMPLATE = "{instance}/c/{name}" composable( route = "c/{name}/{instance}", deepLinks = listOf( navDeepLink { uriPattern = "https://$DEEP_LINK_TEMPLATE" uriPattern = "http://$DEEP_LINK_TEMPLATE" } ), arguments = listOf( navArgument("name") { type = NavType.StringType }, navArgument("instance") { type = NavType.StringType } ) ) { backStackEntry -> LaunchedEffect(Unit) { val name = backStackEntry.arguments?.getString("name")!! // 直接从导航参数中拿到instance val instance = backStackEntry.arguments?.getString("instance")!! // 拼接出对应的URI pattern val fullUriPattern = "$instance/c/$name" // 后续数据获取逻辑 } }
注意事项
- 第一种方法不需要改动原有固定实例的深链接遍历逻辑,适合已有固定instance列表的场景;
- 第二种方法更通用,支持任意符合格式的instance,但需要调整深链接的配置方式;
- 如果
DEFAULT_LEMMY_INSTANCES是固定域名列表,第一种方法里可以直接匹配域名来确认对应的instance。
内容的提问来源于stack exchange,提问作者dessalines
相关产品推荐
相关产品推荐

