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