在基本片段中处理Koin(模块已加载错误)



我有一个基础片段和另外两个片段,例如扩展基础片段的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是如何引入到片段堆栈的(。

就我个人而言,我会删除碎片中的模块加载。但我不知道你为什么要卸下它们。

稍微好一点的方法

首先想到的是:

  1. 您创建了一个新的基于Activity的类
  2. 在这个类的内部,从onCreate加载模块
  3. 您可以显示所需的片段,在此活动的片段后堆栈中上下导航
  4. 调用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加载模块,如上所述但请注意,在应用程序的生命周期中,可以多次重新创建活动

最新更新