You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Android Navigation参数默认值为null时如何通过Safe Args传值

问题成因

这是低版本Navigation Safe Args插件的已知代码生成缺陷:

  1. 当目标页面所有参数都配置了默认值时,Safe Args默认会生成两种跳转重载方法:无参方法(所有参数取默认值填充)、携带全部参数的方法。
  2. 2.4.0之前版本的Safe Args,对于自定义Parcelable/Serializable类型的可空参数,当默认值设为@null时,会出现重载方法生成异常——只会生成无参的跳转方法,不会生成携带参数的重载方法。此时你主动传递Character参数时,会匹配不到对应方法,抛出参数长度不匹配的错误。
  3. 你删除默认值后,该参数变为必传参数,Safe Args就只会生成携带Character参数的跳转方法,因此传参功能恢复正常。

解决方案

  • 方案1:升级Navigation组件全库版本到2.4.0及以上稳定版,该版本已修复自定义可空类型带null默认值的重载方法生成问题,升级后重新build项目即可正常传参。
  • 方案2:如果暂时无法升级版本,改用Builder模式手动设置参数即可:
    Kotlin示例:
    val directions = BookDescriptionFragmentDirections.actionBookDescriptionFragmentToBookListFragment().apply {
        character = yourCharacterInstance
    }
    findNavController().navigate(directions)
    
    Java示例:
    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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.01 21:36:04