从Java Application类将App上下文传递给Koin

时间:2019-09-16 07:17:34

标签: android koin

我有一个Java应用程序类,不能将其更改为Kotlin。我像这样初始化Koin:

   KoinApplication koinApp = KoinApplication.create()
            .printLogger()
            .modules(
                    myModule
            );
    start(koinApp);

我的模块是在另一个文件中创建的:

@JvmField
val myModule = module {
    single { DateUtil(androidContext()) }
    factory<ListPresenterContract> { MyListPresenter() }
}

但是,当我访问该文件DateUtil时,遇到关于androidContext()的错误:

Caused by: org.koin.android.error.MissingAndroidContextException: Can't resolve Context instance. Please use androidContext() function in your KoinApplication configuration.
at org.koin.android.ext.koin.ModuleExtKt.androidContext(ModuleExt.kt:33)
at koin.MyKoinModulesKt$MyModule$1$1.invoke(MyKoinModules.kt:16)
at koin.MyKoinModulesKt$MyModule$1$1.invoke(Unknown Source:4)
at org.koin.core.instance.DefinitionInstance.create(DefinitionInstance.kt:54)
at org.koin.core.instance.SingleDefinitionInstance.get(SingleDefinitionInstance.kt:40)
at org.koin.core.definition.BeanDefinition.resolveInstance(BeanDefinition.kt:70)
at org.koin.core.scope.Scope.resolveInstance(Scope.kt:165)
at org.koin.core.scope.Scope.get(Scope.kt:128)
at view.MyViewerListAdapter$$special$$inlined$inject$1.invoke(Scope.kt:327)
at kotlin.SynchronizedLazyImpl.getValue(LazyJVM.kt:74)
at view.MyViewerListAdapter.getDateUtil(Unknown Source:7)
at view.MyViewerListAdapter.setModelView(MyListAdapter.kt:77)
at view.MyViewerListAdapter.onBindViewHolder(MyViewerListAdapter.kt:45)
at view.MyViewerListAdapter.onBindViewHolder(MyListAdapter.kt:27)

我怀疑恰好在应用程序类之前 初始化了我的模块,并且为androidContext获取了空值。而且只有当我实际访问应该具有上下文的文件时,它才不会延迟进行初始化,而我仍然具有空上下文。我不知道如何在Java应用程序类中解决此问题,因此与此同时我从模块中删除了上下文。

2 个答案:

答案 0 :(得分:0)

基于最新版本2.0.1标准

在AppModult.kt

val appContext = module {
    single(named("appContext")) { androidContext() }
}

在Application.kt

startKoin {
            androidContext(this@App)
            androidFileProperties()
            modules(listOf(appContext))
        }

答案 1 :(得分:0)

创建Kotlin klass(JavaKoinApplication.kt)

fun start(myApplication: Application) {
startKoin(listOf(module)) with (myApplication)}

然后在Java应用程序类中调用该类

JavaKoinApplication.start(this);