如何在基于字符串的Route导航时传递Bundle参数?
为基于字符串的Route导航传递Bundle参数的方法
当使用字符串类型Route而非ID导航时,由于没有直接接收route: String和Bundle的navigate重载方法,可通过以下几种方案传递参数:
方案1:参数拼接进Route字符串(基础用法)
Navigation组件支持在Route中定义参数占位符,直接将参数值拼接进Route即可传递:
- 先定义带参数占位符的Route:
object navRoutes { const val home = "home" // 用{参数名}定义必填参数占位符 const val confirmation = "confirmation/{amount}" // 用?标记可选参数 const val profile = "profile?userId={userId}" }
- 导航时拼接参数值:
val amount = 100 // 必填参数直接拼接 view.findNavController().navigate("confirmation/$amount") val userId: String? = "123" // 可选参数可拼接或省略 view.findNavController().navigate(if (userId != null) "profile?userId=$userId" else "profile")
- 目标页面接收参数:
val amount = arguments?.getString("amount")?.toInt() val userId = arguments?.getString("userId")
方案2:通过NavOptions传递Bundle(不推荐)
可借助NavOptions.Builder的setArguments方法传入Bundle,但这种方式可能和Navigation的参数解析逻辑冲突,仅作为临时替代方案:
val bundle = bundleOf("amount" to 100) val navOptions = NavOptions.Builder() .setArguments(bundle) .build() view.findNavController().navigate(navRoutes.home, navOptions)
方案3:使用Safe Args插件(推荐,类型安全)
Safe Args是Navigation官方提供的类型安全参数传递插件,完美适配字符串Route场景,还能避免手动拼接的错误:
- 项目根目录
build.gradle添加插件依赖:
plugins { id "androidx.navigation.safeargs.kotlin" version "2.7.7" }
在导航图中配置目标页面的参数,插件会自动生成对应的方向类。
导航时调用生成的方法传递参数:
// 生成的方向类会自动处理Route和参数 val action = ConfirmationDirections.actionToConfirmation(amount = 100) view.findNavController().navigate(action.route)
- 目标页面通过生成的参数类接收:
val args = ConfirmationArgs.fromBundle(requireArguments()) val amount = args.amount
内容的提问来源于stack exchange,提问作者Elye
相关产品推荐
相关产品推荐

