使用Koin依赖注入时遭遇kotlin.time.TimeMark接口/类不兼容错误
问题
参考教程实现Koin依赖注入时,将原Koin 2.0.1依赖替换为3.0.2版本:
implementation "io.insert-koin:koin-core:3.0.2" implementation "io.insert-koin:koin-android:3.0.2"
在App类中注册模块:
class App : Application() { override fun onCreate() { super.onCreate() startKoin { androidLogger(Level.DEBUG) androidContext(this@App) modules(listOf(repositoryModule, viewModelModule, retrofitModule, apiModule)) } } }
运行时触发如下错误,错误指向modules(listOf(...))代码行:
java.lang.IncompatibleClassChangeError: Found interface kotlin.time.TimeMark, but class was expected (declaration of 'kotlin.time.TimeMark' appears in /data/app/pkg-ptdpYgWwV-BVxpo5sVLPxg==/base.apk!classes15.dex)
模块代码如下:
val viewModelModule = module { viewModel { UserViewModel(get()) } } val repositoryModule = module { single { UserRepository(get()) } } val apiModule = module { fun provideUseApi(retrofit: Retrofit): GithubApi { return retrofit.create(GithubApi::class.java) } single { provideUseApi(get()) } } val retrofitModule = module { fun provideHttpClient(): OkHttpClient { val okHttpClientBuilder = OkHttpClient.Builder() return okHttpClientBuilder.build() } fun provideRetrofit(client: OkHttpClient): Retrofit { return Retrofit.Builder() .baseUrl("https://api.github.com/") .addConverterFactory(GsonConverterFactory.create()) .client(client) .build() } single { provideHttpClient() } single { provideRetrofit(get()) } }
未直接使用TimeMark,请问该错误的原因是什么?
原因分析与解决
这个错误的核心是Kotlin版本不兼容:
- Koin 3.0.2依赖的Kotlin版本中,
kotlin.time.TimeMark是一个类; - 而你当前项目使用的Kotlin版本较低(通常为Kotlin 1.4及以下),在这些旧版本里
TimeMark是一个接口。
当Koin库试图以类的方式调用TimeMark,但项目编译时用的是接口版本,就会触发IncompatibleClassChangeError。
解决步骤
- 打开项目根目录的
build.gradle(或build.gradle.kts)文件,找到Kotlin插件版本配置,将其升级到与Koin 3.0.2兼容的版本(推荐Kotlin 1.5.31及以上,Koin 3.x官方适配的最低Kotlin版本是1.5):// 示例:升级Kotlin插件版本 buildscript { ext.kotlin_version = "1.5.31" dependencies { classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version" } } - 同步Gradle项目,清理并重建工程(Build -> Clean Project -> Rebuild Project)。
内容的提问来源于stack exchange,提问作者Andrew
相关产品推荐
相关产品推荐

