在多模块应用程序中使用koin

时间:2019-10-31 12:37:48

标签: android kotlin dependency-injection multi-module koin

您好,在多模块应用程序中,我正在使用loadKoinModules()加载子模块,并在功能模块中使用unloadKoinModules()对其进行卸载,我的代码如下

class FeatureActivity:AppCompatActivity(){
    private val loadFeatures by lazy { loadKoinModules(featureModule) }
    private fun injectFeatures() = loadFeatures

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        injectFeatures()
    }

   override fun onDestroy() {
        super.onDestroy()
        unloadKoinModules(featureModule)
    }
} 

一切正常,但问题是当加载了同一活动的另一个实例时开始的。当前活动处于后台。应用由于以下错误而崩溃

org.koin.error.BeanOverrideException:  Try to override definition with Factory

有没有办法避免此错误

3 个答案:

答案 0 :(得分:2)

某种程度上,这是对的,您可以动态卸载,这就是为什么添加unloadKoinModules link

但是为什么不卸载onStop?根据android生命周期以及您要执行的操作,您必须在unload中的onStop

当活动获得焦点时,onCreate将发生(并且您将加载模块),稍后,当活动失去焦点时,onStop将发生(并且您将卸载模块),并在事件之间循环。

enter image description here

class FeatureActivity:AppCompatActivity(){
    private val loadFeatures by lazy { loadKoinModules(featureModule) }
    private fun injectFeatures() = loadFeatures

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        injectFeatures()
    }

   override fun onStop() {
        super.onStop()
        unloadKoinModules(featureModule)
    }
} 

答案 1 :(得分:1)

一些可能性:

  • 在顶级应用程序级别加载功能模块,并且不要将其限制在任何活动生命周期内。

  • 在模块加载/卸载周围添加一个引用计数包装器,这样就不会在已加载模块的情况下重新加载模块,并且仅在使用计数为零时才将模块卸载。 (您可以通过不关心卸载来简化此操作,并将计数更改为仅一个“已初始化”的布尔值。)

答案 2 :(得分:1)

Koin不允许您重新定义一个已经存在的定义(type,name,path…)。您会遇到错误。

您需要allow definition override:-

val featureModule = module {

    // override for this definition
    single<yourType>(override=true) { YourClass() }
}

还可以在模块级别覆盖,而不是仅在定义级别覆盖:-

val featureModule = module(override=true) {

    single<yourType> { YourClass() }
}

重要:- 在列出模块和覆盖定义时,顺序很重要。您的模块列表中的最后一个必须具有覆盖定义。