如何修复Koin lib中的“找不到类型为“上下文”的兼容定义”?

时间:2018-09-15 12:00:25

标签: android koin

我只是开始在android中使用Koin lib(以替换Dagger 2),并且在准备进行测试的项目中使用模块中的android应用上下文存在问题

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

Koin在App类中启动:

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的配置?在目标项目中,我只有几个模块,这些模块在很大程度上取决于应用程序上下文。而且我不想在这种情况下使用全局引用。

3 个答案:

答案 0 :(得分:2)

解决方案很简单,但不太明显。

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

所以您必须更换

import org.koin.standalone.StandAloneContext.startKoin

收件人

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

Application类中

请告知是否可行

答案 1 :(得分:1)

尽量不要为val上下文创建applicationAndroid(),而应在工厂/单个闭包内部直接将其用作您的一个依赖项的参数。 我在项目中正在做的事情是这样的:

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

其中的MyNavigator类为:

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()) }
}

即使图表中没有Context实例,get()也会为您检索上下文;既不是工厂也不是单身人士。 Koin可能在幕后做了一些事情。我试图将其与其他类型的依赖项一起使用,但它无法正常工作。

答案 2 :(得分:1)

我已解决此问题,将我的所有import boto3 client = boto3.client("batch") response = client.submit_job( jobName='AndrewJob', jobQueue='AndrewJobQueue', jobDefinition='AndrewJobDefinition', containerOverrides={ 'command': 'ls & python myjob.py'.split(), }, timeout = {'attemptDurationSeconds': 100} ) print(response) 添加到viewModels