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

Jetpack Navigation加载带可空参数起始目的地时抛出IllegalStateException

解决Jetpack Navigation起始目的地可空参数的Null Arguments异常

这个问题其实是navArgs()委托的默认行为导致的——它默认要求Fragment的arguments必须存在,但当你作为起始目的地启动且没有显式传递参数时,Navigation组件并不会自动生成包含默认null值的arguments Bundle,这就触发了异常。

下面是几个可行的解决方案:

方案1:使用可空版本的navArgs()

修改你获取参数的方式,允许args为null:

// 注意添加nullable = true参数
private val args: MyStartFragmentArgs? by navArgs(nullable = true)

override fun onAttach(context: Context) {
    super.onAttach(context)
    val title = args?.dataObject?.name ?: getString(R.string.start_list_title)
    // 后续逻辑...
}

这个方案最直接,navArgs(nullable = true)会处理arguments为null的情况,返回可空的Args对象,避免崩溃。

方案2:启动时显式传递默认参数

在宿主Activity中设置NavController时,主动传递包含null参数的Bundle:

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    setContentView(R.layout.activity_main)
    
    val navController = findNavController(R.id.nav_host_fragment)
    // 显式传递null参数,确保arguments存在
    val startBundle = bundleOf("dataObject" to null)
    navController.setGraph(R.navigation.nav_graph, startBundle)
}

这样起始目的地的arguments就会被正确初始化,by navArgs()就能正常获取到包含null值的Args对象。

方案3:手动解析Arguments

放弃navArgs()委托,手动处理arguments的null情况:

private val args: MyStartFragmentArgs? by lazy {
    arguments?.let { MyStartFragmentArgs.fromBundle(it) }
}

override fun onAttach(context: Context) {
    super.onAttach(context)
    val title = args?.dataObject?.name ?: getString(R.string.start_list_title)
    // 后续逻辑...
}

这种方式更灵活,完全由你控制arguments的解析逻辑。

为什么会出现这个异常?

你在导航XML中的配置是正确的(app:nullable="true"和android:defaultValue="@null"),但navArgs()默认实现会检查arguments是否为null,当起始目的地没有被显式传递参数时,Fragment的arguments字段就是null,这就违反了navArgs()的非空假设,从而抛出IllegalStateException。

内容的提问来源于stack exchange,提问作者Sebastien

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.14 06:56:55