快速修复它
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 加载模块,如上所述。 但请注意,在应用程序的生命周期中可以多次重新创建活动。