Jetpack Compose Navigation如何传递包含斜杠(/)的字符串参数
解决方案
方案1:使用正则匹配路由规则(最简单)
Navigation组件支持在路径参数后追加正则表达式,让参数匹配包含斜杠在内的所有后续字符,无需额外编码解码操作。
修改你的路由定义代码即可:
composable( // 加:.+ 表示匹配任意长度的任意字符,包括斜杠 route = "Home/{url:.+}", arguments = listOf( navArgument("url") { type = NavType.StringType } ) )
跳转逻辑不需要改动,直接传带斜杠的字符串即可:
val url = "random.com/get/object" navController.navigate("Home/${url}")
注意:该方案仅适合带斜杠的参数是路由的最后一个参数的场景,如果后面还要拼接其他路径参数,需要用第二种方案
方案2:URL编码 + 解码(兼容性最强)
如果你的路由还有后续参数,或者参数中还包含?、&、%等其他特殊字符,可以先对参数做URL编码再拼接路由,接收参数时再解码还原:
跳转时编码
import java.net.URLEncoder import java.nio.charset.StandardCharsets val originalUrl = "random.com/get/object" // 编码后特殊字符会被转义,斜杠/会变成%2F val encodedUrl = URLEncoder.encode(originalUrl, StandardCharsets.UTF_8.name()) navController.navigate("Home/${encodedUrl}")
接收时解码
import java.net.URLDecoder import java.nio.charset.StandardCharsets composable( route = "Home/{url}", arguments = listOf(navArgument("url") { type = NavType.StringType }) ) { backStackEntry -> val encodedUrl = backStackEntry.arguments?.getString("url") ?: "" // 解码还原原始字符串 val originalUrl = URLDecoder.decode(encodedUrl, StandardCharsets.UTF_8.name()) // 后续使用originalUrl即可 }
该方案适配所有场景,不会受参数位置、特殊字符类型的限制。
内容的提问来源于stack exchange,提问作者Thiago Souza
相关产品推荐
相关产品推荐

