android 将存储库类的示例注入到由具有ViewModelScope的模块提供的应用程序类中

0lvr5msh  于 2023-02-06  发布在  Android
关注(0)|答案(2)|浏览(122)

我遇到了一个问题,我需要将存储库类的示例注入到模块提供的应用程序类中(安装在ViewModelComponent中,并提供标有@ViewModelScope注解的函数)

    • 存储库**
interface IARepository

class ARepository @Inject constructor() : IARepository
    • 模块**
@Module
@InstallIn(ViewModelComponent::class)
interface RepositoryModule {

    @Binds
    @ViewModelScoped
    fun provideARepos(impl: ARepository): IARepository
}
    • 视图模型**
@HiltViewModel
class TestViewModel @Inject constructor(
    private val useCase1: UseCase1,
    private val useCase2: UseCase2,
) {
   ...
}

两个UseCase1UseCase2正在使用IARepository,因为如果我为IARepository提供ViewModelScope,两个示例useCase1useCase2将使用相同的存储库示例。
它一直工作,直到我将存储库注入到应用程序中(单例事物)

    • 应用程序**
@HiltAndroidApp
class TestApplication : Application() {

    @Inject
    lateinit var a: IARepository
}

在那之后我得到了错误

[Dagger/MissingBinding] IARepository cannot be provided without an @Provides-annotated method.
  public abstract static class SingletonC implements FragmentGetContextFix.FragmentGetContextFixEntryPoint

Application_HiltComponents.java:129: error: [Dagger/MissingBinding] ...core.domain.IARepository cannot be provided without an @Provides-annotated method.
  public abstract static class SingletonC implements FragmentGetContextFix.FragmentGetContextFixEntryPoint,
                         ^
  A binding for ....core.domain.IARepository exists in ...Application_HiltComponents.ViewModelC:
      ....core.domain.IARepository is injected at
          [...Application_HiltComponents.SingletonC] ...Application.a
      ...Application is injected at
          ...Application_HiltComponents.SingletonC] ...Application_GeneratedInjector.injectMoonRoverApplication

在应用程序中,我尝试切换到直接注入实现类ARepository,它工作正常。

@HiltAndroidApp
class TestApplication : Application() {

    @Inject
    lateinit var a: ARepository
}

但我还是想用接口,有什么解决办法吗?

qyswt5oh

qyswt5oh1#

我认为您必须在模块中使用@Provides,如下所示

@Module
@InstallIn(ViewModelComponent::class)
interface RepositoryModule {

    @Binds
    @ViewModelScoped
    @Provides
    fun provideARepos(impl: ARepository): IARepository
}

还可以在视图模型中添加@HiltViewModel,如下所示

@HiltViewModel 
class TestViewModel @Inject constructor(
private val useCase1: UseCase1, private val useCase2: UseCase2
) {
       ...
    }

希望对你有帮助。

5cnsuln7

5cnsuln72#

在视图模型中,请指定@HiltViewModel

@HiltViewModel 
class TestViewModel @Inject constructor(
private val useCase1: UseCase1, private val useCase2: UseCase2
) {
       ...
    }

编辑:-

@Module
    @InstallIn(SingletonComponent::class)
    object Module {
    @Provides
        fun ProvideImplRepo() = ImplRepo()
    }
    @Module
    @InstallIn(ViewModelComponent::class)
    abstract class RepositoryModule {
    
        @Binds
        abstract fun bindLoginRepository(impl: ImplRepo): Repo
}

相关问题