4

长话短说,我正面临 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()
    }
}

所以我的问题是如何解决它?可能我以错误的方式使用范围。

4

0 回答 0