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

引入navigation-compose后实现ViewModelProvider.Factory报JvmDefault错原因

问题根本原因

这个编译错误的触发逻辑来自Kotlin编译器的JVM默认方法兼容性校验规则:

  • 当编译期检测到你要继承/实现的Java接口带有@JvmDefault标记的成员(即Java 8+规范里的接口默认方法)时,会强制要求项目配置-Xjvm-default系列编译参数,否则直接中断编译抛出对应错误。
  • 引入navigation-compose依赖前你的代码能正常编译,是因为当时项目依赖的低版本androidx.lifecycle:lifecycle-viewmodel组件中,ViewModelProvider.Factory接口没有定义默认方法,也不存在@JvmDefault标记,不会触发编译器的上述校验。
  • androidx.navigation:navigation-compose:2.5.0-rc02本身依赖了2.5.0及以上版本的lifecycle系列组件,会通过Gradle的依赖传递机制,把你项目中原先使用的低版本lifecycle-viewmodel替换为高版本。
  • 从lifecycle 2.5.0版本开始,AndroidX团队对ViewModelProvider.Factory接口做了改造:新增了带CreationExtras参数的create重载方法,并且将该方法实现为接口默认方法,编译后字节码会带上@JvmDefault标记,适配Java 8的接口默认方法特性。
  • 依赖替换完成后,你自定义的SimpleFactory实现的是带@JvmDefault成员的新版ViewModelProvider.Factory接口,在未配置对应编译参数的情况下,就会触发你看到的编译错误,错误定位正好指向接口继承位置。
  • 移除navigation-compose依赖后,高版本lifecycle的传递依赖也会被移除,项目回退到使用无默认方法的旧版ViewModelProvider.Factory接口,编译错误自然消失。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.29 01:09:19