我遇到了一个问题,我需要将存储库类的示例注入到模块提供的应用程序类中(安装在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,
) {
...
}
两个UseCase1
和UseCase2
正在使用IARepository
,因为如果我为IARepository
提供ViewModelScope,两个示例useCase1
和useCase2
将使用相同的存储库示例。
它一直工作,直到我将存储库注入到应用程序中(单例事物)
- 应用程序**
@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
}
但我还是想用接口,有什么解决办法吗?
2条答案
按热度按时间qyswt5oh1#
我认为您必须在模块中使用@Provides,如下所示
还可以在视图模型中添加@HiltViewModel,如下所示
希望对你有帮助。
5cnsuln72#
在视图模型中,请指定@HiltViewModel
编辑:-