【问题标题】:How to fix "No compatible definition found for type 'Context'" from Koin lib?如何修复 Koin lib 中的“找不到类型 'Context' 的兼容定义”?
【发布时间】:2018-09-15 12:00:24
【问题描述】:

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

【问题讨论】:

  • 我正面临这个问题。接受的答案是否为您解决了问题?

标签: android kotlin dependency-injection koin


【解决方案1】:

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

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

所以你必须更换

import org.koin.standalone.StandAloneContext.startKoin

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

Application类中

请判断这是否有效。

【讨论】:

  • nope :( 查看已编辑的问题。很容易复制:只需设置新项目并配置 Koin。
  • 如果我想从 Java(而不是 Kotlin)执行此操作怎么办?
  • 它对我有用,我的项目也有同样的错误问题,谢谢!
【解决方案2】:

尽量不要为applicationAndroid() 上下文创建val,而是直接在 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))
    }
}

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

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

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

【讨论】:

  • 我会检查但看到:github.com/InsertKoinIO/koin/issues/190 Koin 的作者说两种方式都可以:)
  • 我已经看到了这个问题,但在我的情况下,作为 val 的上下文声明根本不起作用。
  • 另一种解决方案:val ctx by lazy{ androidApplication() }
【解决方案3】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-02-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-07-09
    • 2021-02-08
    相关资源
    最近更新 更多