You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何创建父Fragment的Koin作用域以供子Fragment使用

借助父Fragment的Koin Scope在子Fragment间共享实例的实现方案

完全可行,核心是让子Fragment关联到父Fragment的Scope,而非使用自身的Fragment Scope。以下是修改后的完整实现代码及关键说明:

1. 完善父Fragment的Scope绑定

父Fragment需要明确绑定自己的Koin Scope,确保Scope生命周期与Fragment一致:

class ParentFragment : Fragment() {
    // 自动创建/获取与ParentFragment绑定的Scope,生命周期跟随Fragment
    private val parentScope by scope<ParentFragment>()
}

2. 子Fragment通过父Scope注入实例

子Fragment不能直接使用默认的inject()(默认指向自身Scope),需要通过父Fragment的Scope来获取共享实例:

class Child1Fragment : Fragment() {
    // 安全获取父Fragment的Scope
    private val parentScope get() = findParentFragment<ParentFragment>()?.scope<ParentFragment>()
        ?: error("当前子Fragment必须依附于ParentFragment")
    
    // 通过父Scope注入共享的TestClass实例
    private val testClass: TestClass by parentScope.inject()
}

class Child2Fragment : Fragment() {
    // 也可以简化为一行代码
    private val testClass: TestClass by findParentFragment<ParentFragment>()!!.scope<ParentFragment>().inject()
}

3. 保持Module定义不变

你原来的Module配置是正确的,onClose会在ParentFragment销毁(Scope关闭)时自动调用TestClass的close()方法:

val testModule = module {
    scope<ParentFragment> {
         scopedOf(::TestClass).onClose { it?.close() } 
    }
}

关键说明

  • 所有子Fragment通过父Scope注入的TestClass是同一个实例,实现跨子Fragment共享
  • ParentFragment销毁时,对应的Koin Scope会自动关闭,关联的TestClass实例会被清理,close()方法自动执行
  • 若子Fragment可能依附于非ParentFragment的组件,建议用findParentFragment<ParentFragment>()做安全判断,避免异常

内容的提问来源于stack exchange,提问作者Sabrak

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.28 09:35:18