首页 > 解决方案 > Koin - Android 的嵌套范围问题

问题描述

使用的 Koin 版本:2.1.0-alpha-8

FirstFragment我有一个包含两个片段 1)和 2)的 FeatureActivitySecondFragment

我的模块看起来像这样

val featureModule = module {

    scope<FeatureActivity> {

        // FeatureDao
        scoped {
            val appDatabase: AppDatabase = get()
            appDatabase.featureDao()
        }

        scope(named(FirstFragment.SCOPE_ID)) {
            scoped { FirstFragmentRepository(get()) }
            viewModel { FirstFragmentViewModel(get()) } // needs FeatureDao
            scoped { FirstFragmentAdapter(get()) }
        }

        scope(named(SecondFragment.SCOPE_ID)) {
            scoped { SecondFragmentRepository(get()) }
            viewModel { SecondFragmentViewModel(get()) } // needs FeatureDao
            scoped { SecondFragmentAdapter(get()) }
        }

    }

在范围内,我想将对等的访问限制为仅对 FirstFragment 和FirstFragmentRepository等对SecondFragment 的访问。FirstFragmentViewModelSecondFragmentRepositorySecondFragmentViewModel

问题1:但是,我的ViewModels需要注入FeatureDao。FeatureDao鉴于它是父范围 [FeatureActivity 范围] 的一部分,我该如何访问?FeatureDao位于 ActivityScope 中,因为它对于两者都是必要的,FirstFragment并且SecondFragment

我的活动看起来像这样

class FeatureActivity : AppCompatActivity() {

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
         loadKoinModules(featureModule)
    }

    override fun onDestroy() {
        super.onDestroy()
        unloadKoinModules(featureModule)
    }

}

我的 FirstFragment 看起来像这样

class FirstFragment : Fragment() {

    companion object{
        const val SCOPE_ID = "FirstFragment"
    }

    val scope = getKoin().getOrCreateScope(SCOPE_ID, named(SCOPE_ID))
    val viewModel   by lazy {  scope.get<FirstFragmentViewModel>()}
    val adapter  by lazy { scope.get<FirstFragmentAdapter>() }

}

当我这样做时getKoin().getOrCreateScope(SCOPE_ID, named(SCOPE_ID)),应用程序崩溃

Caused by: org.koin.core.error.NoScopeDefFoundException: No Scope Definition found for qualifer 'FirstFragment'
        at org.koin.core.registry.ScopeRegistry.createScope(ScopeRegistry.kt:128)
        at org.koin.core.Koin.createScope(Koin.kt:181)
        at org.koin.core.Koin.getOrCreateScope(Koin.kt:203)
        at com.temp.testkoin.FirstFragment.<init>(FirstFragment.kt:24)

但是,如果我使用val scope = getKoin().getScopeOrNull(SCOPE_ID),则范围设置为 null。

我在这个论坛上经历了一些问题,但没有一个与我想要实现的目标相似。

val featureModule = module {

    scope<FeatureActivity> {

        // FeatureDao
        scope(named("featureDao")) {
            scoped {
                val appDatabase: AppDatabase = get()
                appDatabase.featureDao()
            }
        }

        scope(named(FirstFragment.SCOPE_ID)) {
            scoped { FirstFragmentRepository(get()) }
            viewModel { FirstFragmentViewModel(getScope("featureDao").get()) }
            scoped { FirstFragmentAdapter(get()) }
        }

       ...
       ...

    }

标签: androidkoin

解决方案


推荐阅读