长话短说,我正面临 NoBeanDefFoundException 奇怪的应用程序崩溃,但它是随机发生的。对于某些设备,它可以按预期工作,而对于其他设备,则只是崩溃。
我有一个包含许多 koin 模块的多模块项目,它按预期工作。但是随着应用程序的增长,我决定对其进行一些重构并使用范围。在项目中,我有 4 种范围:
- 根(由 Koin 创建)
- 范围活动
- 范围流
- scope_fragment
我使用范围链接来解决父级的依赖关系。例如 scope_fragment -> scope_flow -> scope_activity -> 根。我也部分加载模块。
下面我提供了一段代码,因此您可以获取上下文。
这是我声明模块的方式:
val categoryDataModule = module {
// here is root scope
single<CategoryRepository> {
CategoryRepositoryImpl(get(), get(), Dispatchers.Default)
}
}
val categoryDomainModule = module {
scope(named(DI.SCOPE_FRAGMENT)) {
// this use case requires CategoryRepository implementation
factory<GetFollowedCategoriesUseCase> { GetFollowedCategories(get()) }
}
}
我创建了一个单元测试“checkModules”,但它因 NoBeanDefFoundException 而失败。尝试调试了一下,发现这里的根作用域在_instanceRegistry
. 它们是应用程序和上下文。
@RunWith(AndroidJUnit4::class)
class CheckModulesTest : KoinTest {
@Test
fun checkAllModules() {
koinApplication {
androidContext(ApplicationProvider.getApplicationContext())
modules(
listOf(
categoryDataModule,
categoryDomainModule
)
)
}.checkModules()
}
}
所以我的问题是如何解决它?可能我以错误的方式使用范围。