【问题标题】:Pass App context to Koin from Java Application class将 App 上下文从 Java 应用程序类传递给 Koin
【发布时间】:2019-09-16 07:17:34
【问题描述】:

我有一个 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 应用程序类中解决这个问题,所以我同时从模块中删除了上下文。

【问题讨论】:

    标签: android koin


    【解决方案1】:

    基于最新版本 2.0.1 标准

    在 AppModult.kt 中

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

    在 Application.kt 中

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

    【讨论】:

    【解决方案2】:

    创建 Kotlin 类 (JavaKoinApplication.kt)

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

    然后在你的 Java 应用程序类中调用这个类

    JavaKoinApplication.start(this);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-11-06
      • 1970-01-01
      相关资源
      最近更新 更多