Android 基本片段中的句柄Koin(模块已加载错误)

Android 基本片段中的句柄Koin(模块已加载错误),android,kotlin,dependency-injection,koin,Android,Kotlin,Dependency Injection,Koin,我有一个碱基片段和另外两个片段,比如片段一,片段二,它们延伸了碱基片段 abstract class BaseFragment(): Fragment(){ init{ loadKoinModules(listOf(sampleModules)) } override fun onDestroyView() { super.onDestroyView() unloadKoinModules(listOf(sampleMod

我有一个碱基片段和另外两个片段,比如片段一,片段二,它们延伸了碱基片段

abstract class BaseFragment(): Fragment(){
    init{
        loadKoinModules(listOf(sampleModules))
    }

    override fun onDestroyView() {
        super.onDestroyView()
        unloadKoinModules(listOf(sampleModules))
    }
}
当我降落在fragmentOne上时,koin模块已加载,一切正常。我从fragmentOne导航到fragmentTwo,在unloadKoinModules之前再次调用loadKoinModules。我认为fragmentOne中加载的模块仍然存在,并且在加载fragmentOne中的模块之前不会被删除。加载和卸载koin模块的正确方式或生命周期是什么

module 'org.koin.core.module.Module@87380fe' already loaded!
module 'org.koin.core.module.Module@cef805f' already loaded!
快把它修好 没有办法解决这个问题,因为首先调用
init
,然后调用Fragment2的
onCreateView
,然后调用Fragment1的
onDestroyView
(并不总是调用它,这取决于Fragment2如何引入到片段堆栈中)

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

稍微好一点的方法 我首先想到的是:

  • 创建一个新的基于
    活动的类
    
  • 在这个类的内部,从
    onCreate
    加载模块
  • 显示所需的片段,在此活动的后堆栈中上下导航
  • 调用
    活动#onDestroy
    时-卸载模块
  • 如何做得更好?(如果可以移除卸载) 首先,确保确实要卸载这些模块。为什么不装一次就走呢?你认为合适的时候自己决定

    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)
        }
      } 
    } 
    
    正如我们所看到的,模块是从
    应用程序
    类加载的。应用程序运行时,只能有一个
    应用程序
    类的有效实例。这意味着
    onCreate
    不会被调用两次,因此从
    Application#onCreate
    加载模块是安全的


    或者,您可以从
    活动
    类的
    onCreate
    加载模块,如上所述但请注意,活动可以在应用程序的生命周期中多次重新创建。

    我仍在学习Koin,您的解释非常好。卸载模块是否会提高应用程序性能?我的想法是只加载我需要的东西,然后卸载它们以节省内存。如果我错了,或者这没有太大影响,也许我应该加载应用程序类中的所有内容,并将其保留。“卸载不需要的koin模块可以提高应用程序性能”——它可以。取决于模块的大小。在任何情况下,它都会释放一些内存。你的意图实际上是一个好的意图,但我认为如果你的应用程序很小或没有利用很多可用资源,这是一个开销。少数模块不会影响性能。如果模块很少使用和/或创建成本低,并且我需要额外的内存,我会卸载模块。如果你需要下载几兆字节的数据才能将模块存储在Koin中,你不应该删除它,IMHO。每个案例都应该研究。感谢您的澄清,我会根据需要重新设计我的应用程序。
    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))
        }
    }
    
    class MyApplication : Application() {
      override fun onCreate(){
        super.onCreate()
        // start Koin!
        startKoin {
          // declare used Android context
          androidContext(this@MyApplication)
          // declare modules
          modules(myModule)
        }
      } 
    }