3

我刚刚开始在一个为测试准备的 android(替换 Dagger 2)项目中使用 Koin lib。我对模块中的 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 的配置中遗漏了什么吗?在目标项目中,我有一些深度依赖于应用程序上下文的模块。而且我不想对这个上下文使用全局引用。

4

3 回答 3

6

解决方案很简单,但并不那么明显。

Android Studio 不知何故导入了独立的 startKoin 函数而不是特定的 android 函数。

所以你必须更换

import org.koin.standalone.StandAloneContext.startKoin

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

Application课堂上

一定要告诉这是否有效。

于 2018-09-15T12:09:04.367 回答
4

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

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

ps:我也用 Koin 1.0.0 做了一些实验,我注意到你也可以写这样的东西:

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

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

于 2018-09-18T15:19:33.420 回答
1

我已经解决了这个问题,将我的所有内容添加viewModelsKoin module.

于 2020-01-24T20:40:20.043 回答