android - 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 的访问。FirstFragmentViewModel
SecondFragmentRepository
SecondFragmentViewModel
问题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。
我在这个论坛上经历了一些问题,但没有一个与我想要实现的目标相似。
- 问题 2:我的 Scopes 已经创建。那么为什么
getScopeOrNull()
返回null呢? - 问题 3:我什至尝试过这样做,
getScopeOrNull()
但仍然返回 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()) }
}
...
...
}
- 问题 4:处理我的范围并正确注入我的依赖项的正确方法是什么?
- 问题5:范围稳定吗?删除嵌套范围
scope(named(FirstFragment.SCOPE_ID))
并scope(named(SecondFragment.SCOPE_ID))
让它继续。按预期工作。但是,在给定的 Scope 中访问 Bean(从另一个 Scope)似乎还不支持。不管我怎么努力,它一直在抱怨org.koin.core.error.NoBeanDefFoundException: No definition found for class
解决方案
推荐阅读
- c++ - 将变量传递给函数\使用该变量返回一个新值\重复直到值达到 0
- scala - 如何仍然在 Scala 的单例对象中执行超类的代码体
- c# - 如何创建具有多个查询的实体
- ruby-on-rails - has_many: : 是时候通过控制器了吗?如果是这样,那是什么样的?
- javascript - Javascript - 我应该如何编写一个可重用的方法来等待一组事件中的一个发生?
- html - React 中的图像渲染与 webpack 损坏
- matlab - MATLAB 中的双重积分
- laravel - 如何在 laravel 5.7 中将 www.website.com 更改为 www.website.com/myFolder/ 根 url?
- database - 如何使用 JMeter 进行 cosmos DB 连接?
- javascript - Javascript 元素 addEventListener(没有 jQuery)