我有一个基础片段和另外两个片段,例如扩展基础片段的fragmentOne、fragmentTwo。
abstract class BaseFragment(): Fragment(){
init{
loadKoinModules(listOf(sampleModules))
}
override fun onDestroyView() {
super.onDestroyView()
unloadKoinModules(listOf(sampleModules))
}
}
当我降落在fragmentOne上时,koin模块已经加载,一切都很好。我从fragmentOne导航到fragmentTwo,在卸载KoinModule之前会再次调用loadKoinModule。我认为fragmentOne中加载的模块仍然存在,在加载fragmentTwo的模块之前不会删除。加载和卸载koin模块的正确方式或生命周期是什么?
module 'org.koin.core.module.Module@87380fe' already loaded!
module 'org.koin.core.module.Module@cef805f' already loaded!
快速修复
abstract class BaseFragment(): Fragment(){
init{
// Making sure we do not get "module already loaded" error
unloadKoinModules(listOf(sampleModules))
loadKoinModules(listOf(sampleModules))
}
override fun onDestroyView() {
super.onDestroyView()
unloadKoinModules(listOf(sampleModules))
}
}
这是没有办法的,因为首先调用init
,然后调用Fragment2的onCreateView
,然后调用Fragment1的onDestroyView
(并不总是调用它,这取决于Fragment2是如何引入到片段堆栈的(。
就我个人而言,我会删除碎片中的模块加载。但我不知道你为什么要卸下它们。
稍微好一点的方法
首先想到的是:
- 您创建了一个新的基于
Activity
的类 - 在这个类的内部,从
onCreate
加载模块 - 您可以显示所需的片段,在此活动的片段后堆栈中上下导航
- 调用
Activity#onDestroy
时-卸载模块
class MyActivity: Activity {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
loadKoinModules(listOf(sampleModules))
// load the first fragment
}
override fun onDestroy() {
super.onDestroy()
unloadKoinModules(listOf(sampleModules))
}
}
如何做得更好?(如果可以取消卸载(
首先,确保您真的想卸载这些模块。为什么不只装一次就走呢?根据自己的意愿做出决定
Koin模块只能加载一次。一旦加载,这些模块将在整个应用程序中可用。这意味着你不能两次加载同一个模块-不需要它
在Koin的官方示例中,有一个专门针对Android的示例:
class MyApplication : Application() {
override fun onCreate(){
super.onCreate()
// start Koin!
startKoin {
// declare used Android context
androidContext(this@MyApplication)
// declare modules
modules(myModule)
}
}
}
正如我们所看到的,模块是从Application
类加载的。应用程序运行时,只能有一个有效的Application
类实例。这意味着onCreate
不会被调用两次,因此从Application#onCreate
加载模块是安全的。
或者,您可以从Activity
类的onCreate
加载模块,如上所述但请注意,在应用程序的生命周期中,可以多次重新创建活动