【问题标题】:Koin: how to share class instances between scopesKoin:如何在范围之间共享类实例
【发布时间】:2020-01-16 14:56:38
【问题描述】:

我正在尝试在父活动和子片段的范围之间共享实用程序类的实例。常识会告诉我,因为片段在活动范围内,我应该能够以某种方式访问​​此实用程序。因此,我的模块定义如下所示:

internal val DemoModule = module {

    scope<DemoActivity> {

        scoped <DemoEncryptionHandler>{ DemoEncryptionHandler(androidContext()) }

        scope<DemoEncryptionFragment> {
            viewModel { DemoViewModel(get() /* shared instance of DemoEncryptionHandler */) }
        }
    }
}

当我运行它时,我收到以下错误:

org.koin.core.error.NoBeanDefFoundException: No definition found for class:'com.sample.test.DemoEncryptionHandler'. Check your definitions! 

很明显,它必须以不同的方式进行。我哪里错了?

【问题讨论】:

  • 您需要修改您的范围以提供名称,然后使用getScope("your scope").get() 在其他范围内检索范围。这将为您提供跨范围所需的依赖项。
  • 问题是我失去了从生命周期范围调用这些依赖项的能力。

标签: android kotlin dependency-injection koin


【解决方案1】:

显然这无法做到。我还尝试将此功能添加为扩展功能,但构建和配置范围的方式意味着它比这更难一些。另一方面,可以从 Koin 版本“2.1.0 alpha”链接范围。 所以我现在所做的就是像上面一样声明我的模块。然后我像这样在片段中链接我的范围:

lifecycleScope.linkTo(requireActivity().lifecycleScope)

这似乎工作得很好,尽管它在片段和它的宿主活动之间添加了一个依赖关系,我希望通过使用 Koin 来消除它。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-02-17
    • 1970-01-01
    • 1970-01-01
    • 2019-10-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多