You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Jetpack Compose跨屏幕传递String ArrayList出现深度链接报错如何解决?

问题根因

你遇到的报错是因为Gson序列化后的字符串包含/、?、=、双引号等URL特殊字符,Jetpack Navigation的路由匹配逻辑会将这些字符识别为路径分隔符,导致实际拼接的路由和你预定义的productPhotos/{photos}规则无法匹配,所以抛出找不到目标导航目的地的异常。

修复方案

方案1:URL编码解码(通用稳妥,兼容性最好)

这是最推荐的方案,不需要修改现有导航结构,只需要加编解码逻辑即可:

  1. 修改跳转逻辑,传递前对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))
})
  1. 修改导航配置,接收参数后先做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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.01 19:45:05