【发布时间】:2021-09-13 23:04:52
【问题描述】:
我有一个NetworkModule 和一个RepositoryModule。在我的NetworkModule 中,我有创建改造服务实例的方法(也有创建okHttpClient 和gson 的方法,但这些不相关):
@Module
@InstallIn(SingletonComponent::class)
object NetworkModule {
@Singleton
@Provides
fun provideRetrofit(okHttpClient: OkHttpClient, gson: Gson): Retrofit {
return Retrofit.Builder()
.addConverterFactory(ScalarsConverterFactory.create())
.addConverterFactory(GsonConverterFactory.create(gson))
.baseUrl("null")
.client(okHttpClient)
.build()
}
@Singleton
@Provides
fun provideApiService(retrofit: Retrofit): ApiService {
return retrofit.create(ApiService::class.java)
}
}
然后我想在我的RepositoryModule 中使用ApiService,但 Hilt 只是忽略了 NetworkModule 中的 Provides 方法甚至存在。我查看了生成的代码,找不到提到provideApiService。 Android Studio 也将其标记为未使用。我确定这东西应该可以工作,Android Studio 甚至在相关文件中显示它:
这里是NetworkModule:
@Module
@InstallIn(SingletonComponent::class)
object RepositoryModule {
@Singleton
@Provides
fun provideLoginRepository(
userMessage: MutableLiveData<Message>,
apiService: ApiService
): LoginRepository {
return LoginRepositoryImpl(userMessage, apiService)
}
}
当我尝试构建它时,我得到了这个错误:
error: [Dagger/MissingBinding] LoginRepository cannot be provided without an @Provides-annotated method.
起初似乎存储库无法注入,但我已将其指向 ApiService,因为如果我从 provideLoginRepository 方法参数中删除它,它会成功构建。
我已经尝试了几个小时来解决这个问题,并且尝试了几乎所有方法。如果有人知道这是怎么回事,我会非常感激。提前致谢。
编辑:在 provideLoginRepository 函数内创建 ApiService 的实例可以使一切正常并且应用程序成功构建,这不是所需的修复:
@Singleton
@Provides
fun provideLoginRepository(
userMessage: MutableLiveData<Message>,
retrofit: Retrofit
): LoginRepository {
return LoginRepositoryImpl(userMessage, retrofit.create(ApiService::class.java))
}
【问题讨论】:
-
userMessage: MutableLiveData<Message>是如何提供的?这可能是罪魁祸首,因此无法提供LoginRepository的副作用。 -
@MarkKeen 我也想过这个问题,但是当我在没有 ApiService 的情况下成功构建它时,它就被淘汰了。只是为了完成,它是这样提供的:
@Singleton @Provides fun provideUserMessenger(): MutableLiveData<Message> { return MutableLiveData<Message>() }(丑陋的评论格式,对不起) -
当你从
provideLoginRepository()中删除参数并返回一个空对象时会发生什么,即provideLoginRepository() : LoginRepository = object : LoginRepository { .... overridden methods }- 所以你不依赖于提供者链。 -
。当然我假设你在每次重试之前已经清理了构建缓存..
-
@MarkKeen 好吧,这几乎就是我所做的,但只删除了
apiService。之后,它就成功构建了。需要明确的是,在provideLoginRepository()中创建服务实例可以工作并且还可以构建(请参阅我的编辑)
标签: android kotlin dependency-injection retrofit2 dagger-hilt