Jetpack Compose Navigation传递Float参数出现类型转换错误如何解决
问题根因
你拼接路由跳转时,${product.price} 会将Float值直接转为字符串拼入URL路径,Jetpack Compose Navigation从路径中读取参数时默认拿到的是字符串类型,即便你声明了NavType.FloatType,也不会自动完成字符串到Float的类型转换,因此触发类型转换异常。
解决方案
方案1:手动转换类型(最快修复)
取参数时先读取字符串格式的price值,再手动转为Float类型即可,同时建议用toFloatOrNull避免转换崩溃:
composable( route = Screen.InspectProduct.route + "/{description}/{title}/{price}/{imgUrl}", arguments = listOf( navArgument(name = "title") { NavType.StringType }, navArgument(name = "description") { NavType.StringType }, // 这里可以保留FloatType声明,也可以改成StringType,不影响最终效果 navArgument(name = "price") { NavType.StringType }, navArgument(name = "imgUrl") { NavType.StringType }, ) ) { backStackEntry -> InspectProduct1( navController = navController, Product( title = backStackEntry.arguments?.getString("title")!!, description = backStackEntry.arguments?.getString("description")!!, imgUrl = backStackEntry.arguments?.getString("imgUrl")!!, price = backStackEntry.arguments?.getString("price")?.toFloatOrNull() ?: 0f ) ) }
方案2:使用Navigation Safe Args 插件(推荐,长期维护更稳妥)
启用Compose Navigation的Safe Args插件后,插件会自动生成类型安全的路由类,自动处理参数类型转换、特殊字符转义,不需要手动拼接路由,从根源避免这类类型错误、路由匹配错误。
额外注意事项
你当前直接将description、title这类可能包含/、空格、特殊符号的字段拼入路由,很容易出现路由匹配失败的问题,建议这两个字段也和imgUrl一样做URL编码,取参数时再做URL解码。
内容的提问来源于stack exchange,提问作者Atitienei Daniel
相关产品推荐
相关产品推荐

