Kotlin Fragment导航传参:Jetpack Navigation如何同时传递多个Bundle数据?
你之前的写法无法正常运行的核心原因是:Android Navigation组件提供的navigate()方法,不存在「同时接收两个独立Bundle入参」的重载签名,直接拆分传入两个Bundle的写法既不满足方法调用规则,也会触发编译或运行时异常。
Navigation的导航方法仅支持传入单个Bundle对象作为参数容器,完全不需要为了多传数据拆分出多份Bundle单独传入,可根据实际场景选择以下任意一种实现方案:
方案1:直接在单Bundle中写入所有键值对
Kotlin内置的bundleOf()方法本身就支持接收多组键值对参数,不需要拆分多份Bundle,直接把所有要传递的数据写在同一个Bundle里即可:
R.id.maptoLaundry -> { val passBundle = bundleOf( "laundryAddressArgument" to laundry_address_text2.text.toString(), "orderIDArgument" to orderIDArgument ) navController!!.navigate( R.id.action_laundryAddressFragment_to_mapToLaundryFragment, passBundle ) }
方案2:已有两份独立Bundle时直接合并
如果你的业务逻辑中,两个Bundle是从不同代码分支、不同模块生成的,不方便直接合并键值对,可通过Bundle自带的putAll()方法把两个Bundle的内容拼成一个,再传入导航方法:
R.id.maptoLaundry -> { val bundle = bundleOf("laundryAddressArgument" to laundry_address_text2.text.toString()) val bundle2 = bundleOf("orderIDArgument" to orderIDArgument) // 将第二个Bundle的所有数据合并到第一个Bundle中 bundle.putAll(bundle2) navController!!.navigate( R.id.action_laundryAddressFragment_to_mapToLaundryFragment, bundle ) }
最佳实践:如果项目集成了Navigation的Safe Args插件,推荐直接使用插件自动生成的方向类传参,完全避免手动硬编码键名导致的拼写错误、类型不匹配问题。示例写法:
val action = LaundryAddressFragmentDirections .actionLaundryAddressFragmentToMapToLaundryFragment( laundryAddress = laundry_address_text2.text.toString(), orderId = orderIDArgument ) navController.navigate(action)
内容的提问来源于stack exchange,提问作者mafortis
相关产品推荐
相关产品推荐

