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提供了类型安全的参数传递方式,无需手动处理编码,从根源避免这类问题:
- 定义路由时声明参数类型:
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) } }
- 发送参数时使用规范的导航方式:
navController.navigate( "loan_confirmation?supplierName=$supplierName&dueDate=$dueDate" ) // 若启用Safe Args插件,会自动生成类型安全的导航函数,无需手动拼接字符串
内容的提问来源于stack exchange,提问作者nayan dhabarde
相关产品推荐
相关产品推荐

