android 使用AssistedInject时,Hilt无法绑定接口

vulvrdjw  于 2023-06-20  发布在  Android
关注(0)|答案(1)|浏览(163)

我们的应用程序遵循干净的架构,因此在域层中,我们有一个接口和一个用例,如下所示:

  1. interface MyRepository {
  2. suspend fun doSomething(): Result<String>
  3. }
  4. class MyUseCase @Inject constructor(private val repository: MyRepository) {
  5. // implementation
  6. }

在数据层,我们有一个MyRepository的实现,例如名为MyRepositoryImpl。我们像这样绑定仓库:

  1. @Binds
  2. abstract fun binMyRepostory(repository: MyRepositoryImpl): MyRepository

我们在视图模型中使用@AssistedInject,如下所示:

  1. class MyViewModel @AssistedInject constructor(
  2. private val myUseCase: MyUseCase,
  3. @Assisted private var id: Int
  4. ) : ViewModel() {
  5. @AssistedFactory
  6. interface Factory {
  7. fun create(id: Int): MyViewModel
  8. }
  9. companion object {
  10. fun provideFactory(
  11. assistedFactory: Factory,
  12. id: Int
  13. ): ViewModelProvider.Factory = object : ViewModelProvider.Factory {
  14. override fun <T : ViewModel> create(modelClass: Class<T>): T {
  15. return assistedFactory.create(id) as T
  16. }
  17. }
  18. }
  19. }

运行应用程序会显示此错误,但在没有AssistedInject的视图模型中,它可以正常工作。

  1. It error: [Dagger/MissingBinding] package.MyRepository cannot be provided without an @Provides-annotated method.
arknldoa

arknldoa1#

检查创建依赖项的模块安装在何处。
我也遇到了这个问题,并注意到我正在ViewModelComponent::class中安装我的模块。
可能是因为从ViewModel类中删除了@HiltViewModel,所以在ViewModelComponent::class中安装时会出现这个问题。
为了解决这个问题,我不得不将安装模块的组件更改为,例如,SingletonComponent::class

相关问题