如何从 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
。
我刚开始在准备测试的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
。