如何创建父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
相关产品推荐
相关产品推荐

