Jetpack Compose跨屏幕传递String ArrayList出现深度链接报错如何解决?
问题根因
你遇到的报错是因为Gson序列化后的字符串包含/、?、=、双引号等URL特殊字符,Jetpack Navigation的路由匹配逻辑会将这些字符识别为路径分隔符,导致实际拼接的路由和你预定义的productPhotos/{photos}规则无法匹配,所以抛出找不到目标导航目的地的异常。
修复方案
方案1:URL编码解码(通用稳妥,兼容性最好)
这是最推荐的方案,不需要修改现有导航结构,只需要加编解码逻辑即可:
- 修改跳转逻辑,传递前对Gson字符串做URL编码
.clickable(onClick = { val connectionsJSONString = Gson().toJson(messagesList[index].images) // 对包含特殊字符的字符串做URL编码 val encodedJson = URLEncoder.encode(connectionsJSONString, StandardCharsets.UTF_8.name()) navController.navigate(Screen.ProductPhotos.withArgs(encodedJson)) })
- 修改导航配置,接收参数后先做URL解码再使用
composable( route = Screen.ProductPhotos.route+"/{photos}", arguments = listOf( navArgument("photos"){ // 显式指定参数类型为字符串 type = NavType.StringType } ) ) { entry-> val encodedPhotos = entry.arguments?.getString("photos")!! // 解码得到原始Gson字符串 val photosJson = URLDecoder.decode(encodedPhotos, StandardCharsets.UTF_8.name()) ProductPhotos(photos = photosJson) }
方案2:共享ViewModel(适合传递大量数据)
如果你的图片列表元素非常多,路由参数传递容易触发长度限制,可以在两个页面共享同一个作用域为父导航图的ViewModel,直接把图片列表存在ViewModel中,跳转后从ViewModel取数据即可,不需要走路由参数传递。
注意事项
- 所有包含特殊字符的参数(比如URL、JSON字符串)都不能直接拼接在路由路径中,必须先做URL编码
- 如果使用Navigation 2.4.0及以上版本,也可以通过官方提供的Serializable/Parcelable参数类型直接传递集合,不需要转Gson字符串
内容的提问来源于stack exchange,提问作者Dark Night
相关产品推荐
相关产品推荐

