Android Dagger-Hilt 忽略@Provides 方法
Android Dagger-Hilt ignores @Provides method
我有一个 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))
}
好的,我已经解决了这个问题。事实证明 java 不支持(与 kotlin 相反)包名称中的 interface
。你猜怎么着,ApiService
在一个名为 interface
的包中。重命名包后,一切正常。
我有一个 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))
}
好的,我已经解决了这个问题。事实证明 java 不支持(与 kotlin 相反)包名称中的 interface
。你猜怎么着,ApiService
在一个名为 interface
的包中。重命名包后,一切正常。