如何从 Koin 库修复 "No compatible definition found for type 'Context'"?

How to fix "No compatible definition found for type 'Context'" from Koin lib?

我刚开始在准备测试的android(替换 Dagger 2)项目中使用 Koin 库。我对模块中的 android 应用上下文有疑问:

val M = module {
   val ctx = androidApplication() //here error
}

Koin 已在 App 中启动 class:

import android.app.Application
import android.content.Context
import org.koin.android.ext.android.startKoin

class App : Application() {

    override fun onCreate() {
        super.onCreate()
        startKoin(this, listOf(M))
    }
}

我得到日志:

D/App: onCreate()
I/KOIN: [context] create
E/KOIN: [ERROR] - Error while resolving instance for class 'android.app.Application' - error: org.koin.error.NoBeanDefFoundException: No compatible definition found for type 'Application'. Check your module definition 

然后应用程序崩溃了。我是否遗漏了 Koin 配置中的某些内容?在目标项目中,我有几个模块非常依赖于应用程序上下文。而且我不想对这个上下文使用全局引用。

解决方法很简单,但不是很明显。

Studio 以某种方式 Android 导入独立的 startKoin 函数而不是特定的 android 函数。

所以你必须更换

import org.koin.standalone.StandAloneContext.startKoin

import org.koin.android.ext.android.startKoin

Application class

请告诉我这是否有效。

尽量不要为 applicationAndroid() 上下文创建 val,而是直接在 factory/single 闭包内使用它作为您的依赖项之一的参数。 我在我的项目中所做的是这样的:

val appModule = module(override = true) {
    factory<Navigator> { MyNavigator(androidApplication()) }
}

MyNavigator class 所在位置:

class MyNavigator(private val context: Context): Navigator {

    override fun goToDetail(detailId: String) {
        context.startActivity(DetailActivity.getIntent(context, detailId))
    }
}

p.s.: 我也用 Koin 1.0.0 做了一些实验,我注意到你也可以这样写:

val appModule = module(override = true) {
    factory<Navigator> { MyNavigator(get()) }
}

即使图形中没有上下文实例的依赖项,get() 也会为您检索上下文;既不是工厂也不是单身人士。可能是 Koin 在幕后做了一些事情。我尝试将它与不同类型的依赖项一起使用,但它仍然有效。

我已经解决了这个问题,将我所有的 viewModels 添加到 Koin module