Android Navigation参数默认值为null时如何通过Safe Args传值
问题成因
这是低版本Navigation Safe Args插件的已知代码生成缺陷:
- 当目标页面所有参数都配置了默认值时,Safe Args默认会生成两种跳转重载方法:无参方法(所有参数取默认值填充)、携带全部参数的方法。
- 2.4.0之前版本的Safe Args,对于自定义Parcelable/Serializable类型的可空参数,当默认值设为
@null时,会出现重载方法生成异常——只会生成无参的跳转方法,不会生成携带参数的重载方法。此时你主动传递Character参数时,会匹配不到对应方法,抛出参数长度不匹配的错误。 - 你删除默认值后,该参数变为必传参数,Safe Args就只会生成携带Character参数的跳转方法,因此传参功能恢复正常。
解决方案
- 方案1:升级Navigation组件全库版本到2.4.0及以上稳定版,该版本已修复自定义可空类型带null默认值的重载方法生成问题,升级后重新build项目即可正常传参。
- 方案2:如果暂时无法升级版本,改用Builder模式手动设置参数即可:
Kotlin示例:
Java示例:val directions = BookDescriptionFragmentDirections.actionBookDescriptionFragmentToBookListFragment().apply { character = yourCharacterInstance } findNavController().navigate(directions)BookDescriptionFragmentDirections.ActionBookDescriptionFragmentToBookListFragment directions = BookDescriptionFragmentDirections.actionBookDescriptionFragmentToBookListFragment(); directions.setCharacter(yourCharacterInstance); Navigation.findNavController(view).navigate(directions); - 方案3:如果你的业务场景下跳转时必须传该参数,不需要无参跳转的逻辑,可以直接去掉
android:defaultValue="@null"配置,强制参数必传即可。
提示:修改导航配置后如果仍然报错,先执行
Clean Project再Rebuild Project,清除旧的Safe Args生成类缓存再测试。
内容的提问来源于stack exchange,提问作者MaYar
相关产品推荐
相关产品推荐

