gpt4 book ai didi

android - 处理基础 fragment 中的 Koin(模块已加载错误)

转载 作者:行者123 更新时间:2023-12-02 13:27:01 24 4
gpt4 key购买 nike

我有一个基本 fragment 和另外 2 个 fragment ,例如扩展基本 fragment 的 fragment 一、 fragment 二。

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

override fun onDestroyView() {
super.onDestroyView()
unloadKoinModules(listOf(sampleModules))
}
}
当我登陆 fragmentOne 时,koin 模块已加载,一切都很好。我从 fragmentOne 导航到 fragmentTwo,在 unloadKoinModules 之前再次调用 loadKoinModules。我认为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先调用,然后 onCreateView Fragment2,然后 onDestroyView Fragment1 (并不总是被调用,取决于 Fragment2 是如何被引入到 fragment 堆栈中的)。
就个人而言,我会从 fragment 中删除模块加载。但我不确定你为什么需要卸载它们。
稍微好一点的方法
我首先想到的是:
  • 您创建一个新的 Activity基于类;
  • 来自 onCreate 的此类内部你加载模块;
  • 您显示您需要的 fragment ,在 的 fragment 的返回堆栈中上下导航此 Activity ;
  • 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 加载的。类(class)。您只能拥有 Application 的一个有效实例应用程序运行时的类。这意味着 onCreate不会被调用两次,所以从 Application#onCreate 加载模块是安全的.
    或者,您可以从 onCreate 加载模块您的 Activity类,如上所述。 但请注意,在应用程序的生命周期中可以多次重新创建 Activity 。

    关于android - 处理基础 fragment 中的 Koin(模块已加载错误),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63277803/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com