引入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
相关产品推荐
相关产品推荐

