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

Jetpack Compose导航时日期字符串'+'丢失问题问询

问题解答:Compose导航传参时日期字符串的+号消失问题

这不是Jetpack Compose的Bug

这是URL编码规则导致的——在HTTP URL中,+符号会被自动解析为空格,直接拼接未编码的日期字符串到导航路径里,自然会出现符号被替换的情况。

解决方案

方案1:手动对参数做URL编码

发送参数时,先对包含特殊字符的字符串进行URL编码,接收时按需解码:

// 发送参数前编码
val encodedSupplierName = URLEncoder.encode(supplierName, "UTF-8")
val encodedDueDate = URLEncoder.encode(dueDate, "UTF-8")

navController.navigate(
    PosTempoRoute.LOAN_CONFIRMATION.getDestinationKey() +
    "?supplierName=$encodedSupplierName&dueDate=$encodedDueDate"
)
// 接收参数时解码(部分导航框架会自动解码,可根据实际情况调整)
val encodedDueDate = getString("dueDate") ?: ""
dueDateText = URLDecoder.decode(encodedDueDate, "UTF-8")

方案2:使用类型安全导航(推荐)

Compose Navigation提供了类型安全的参数传递方式,无需手动处理编码,从根源避免这类问题:

  1. 定义路由时声明参数类型:
object PosTempoRoute {
    val LOAN_CONFIRMATION = composable(
        route = "loan_confirmation?supplierName={supplierName}&dueDate={dueDate}",
        arguments = listOf(
            navArgument("supplierName") { type = NavType.StringType },
            navArgument("dueDate") { type = NavType.StringType }
        )
    ) { backStackEntry ->
        val supplierName = backStackEntry.arguments?.getString("supplierName") ?: ""
        val dueDate = backStackEntry.arguments?.getString("dueDate") ?: ""
        LoanConfirmationScreen(supplierName, dueDate)
    }
}
  1. 发送参数时使用规范的导航方式:
navController.navigate(
    "loan_confirmation?supplierName=$supplierName&dueDate=$dueDate"
)
// 若启用Safe Args插件,会自动生成类型安全的导航函数,无需手动拼接字符串

内容的提问来源于stack exchange,提问作者nayan dhabarde

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.30 21:15:41