我有一个应该是 Singletone 的存储库,因为它在其中保存状态。我这样提供:
@Module
@InstallIn(SingletonComponent::class)
object RepoModule {
@Provides
fun provideMyRepository(/* Deps */): MyRepository = MyRepositoryImpl( /* Deps */ )
}
还有一个 UseCase 仅在某些 ViewModel 中使用,我希望它能像 ViewModel 一样长久存在。所以我想将其创建为 ViewModelComponent:
@Module
@InstallIn(ViewModelComponent::class)
object ViewModelModule {
@Provides
fun provideMyUseCase(myRepo: MyRepository): MyUseCase = MyUseCase(myRepo=myRepo)
}
问题是我无法将此 UseCase 创建为 ViewModelComponent,因为它应该具有与其所有依赖项相同的组件。因此,如果 MyRepository 以 Singletone 形式提供,则 MyUseCase 也应该以相同的方式提供。
我该如何处理这个问题?我也可以将 MyUseCase 设置为 singletone,然后 Hilt 将构建该项目,但我不希望 MyUseCase 在应用程序生命周期中始终存在。
您的两个绑定实际上都没有作用域。根据hilt 文档:
警告:一个常见的误解是模块中声明的所有绑定的作用域都仅限于安装该模块的组件。但是,事实并非如此。只有使用作用域注释进行注释的绑定声明才会被限定作用域。
因此您应该向提供的方法添加范围注释:
@Provides
@Singleton
fun provideMyRepository(/* Deps */): MyRepository = MyRepositoryImpl( /* Deps */)
和
@Provides
@ViewModelScoped
fun provideMyUseCase(myRepo: MyRepository): MyUseCase = MyUseCase(myRepo = myRepo)
因此,如果 MyRepository 以 Singletone 形式提供,则 MyUseCase 也应该以相同的方式提供。
为什么?您可以使用相同的单音
MyUseCase
实例为每个 ViewModel
提供 MyRepository
。
此外,如果所有
MyUseCase
依赖项均由 Hilt 提供,您可以通过使用基于构造函数的注入来避免使用模块:
@ViewModelScoped
class MyUseCase @Inject constructor(
val myRepo: MyRepository,
) {
}