您好,在多模块应用程序中,我正在使用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
有没有办法避免此错误
答案 0 :(得分:2)
某种程度上,这是对的,您可以动态卸载,这就是为什么添加unloadKoinModules
link
但是为什么不卸载onStop
?根据android生命周期以及您要执行的操作,您必须在unload
中的onStop
当活动获得焦点时,onCreate
将发生(并且您将加载模块),稍后,当活动失去焦点时,onStop
将发生(并且您将卸载模块),并在事件之间循环。
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() }
}
重要:- 在列出模块和覆盖定义时,顺序很重要。您的模块列表中的最后一个必须具有覆盖定义。