让我说得更清楚:
我有一个多模块应用程序。有
:app
模块,这是一个 Android 模块,我使用 Hilt 来处理依赖注入,我还创建了一个 :network
模块,该模块仅用于向任何类提供 Retrofit
的实例注入它。我不需要 :network
模块中与 Android 相关的任何内容,因为它非常基本。
我的
build.gradle
模块中的:network
如下:
plugins {
id("java-library")
alias(libs.plugins.jetbrainsKotlinJvm)
alias(libs.plugins.ksp)
}
dependencies {
implementation(libs.retrofit)
implementation(libs.retrofit.moshi.converter)
implementation(libs.moshi)
implementation(libs.moshi.kotlin)
implementation(libs.hilt.core) // com.google.dagger:hilt-core:
ksp(libs.dagger.compiler)
ksp(libs.moshi.codegen)
}
我的模块被声明为:
@InstallIn(SingletonComponent::class)
@Module
object NetworkModule {
@Provides
@Singleton
fun provideMoshi(): Moshi = Moshi.Builder().apply {
addLast(KotlinJsonAdapterFactory())
}.build()
@Provides
@Singleton
fun provideRetrofit(
moshi: Moshi,
): Retrofit = Retrofit.Builder().apply {
baseUrl(REST_COUNTRIES_URL)
addConverterFactory(MoshiConverterFactory.create(moshi))
}.build()
}
最后,我的 ViewModel(在
:app
模块中)注入了 Retrofit:
@HiltViewModel
class MainActivityViewModel @Inject constructor(
val databaseStuff: DatabaseInterface,
val retrofit: Retrofit,
) : ViewModel() {
// ... ViewModel code
}
在我看来这应该可行,但我却得到了熟悉的“缺少绑定用法”错误:
Missing binding usage:
retrofit2.Retrofit is injected at
blabla.MainActivityViewModel(…, retrofit)
blabla.MainActivityViewModel is injected at
blabla.MainActivityViewModel_HiltModules.BindsModule.binds(arg0)
@dagger.hilt.android.internal.lifecycle.HiltViewModelMap java.util.Map<java.lang.String,javax.inject.Provider<androidx.lifecycle.ViewModel>> is requested at
dagger.hilt.android.internal.lifecycle.HiltViewModelFactory.ViewModelFactoriesEntryPoint.getHiltViewModelMap() [blabla.MyApplication_HiltComponents.SingletonC → blabla.MyApplication_HiltComponents.ActivityRetainedC → blabla.MyApplication_HiltComponents.ViewModelC]
我到底错过了什么?在我看来,这应该有效。然而,老实说,我真的不知道 Dagger 在幕后如何工作的来龙去脉。
将我的
ksp(libs.dagger.compiler)
模块的 ksp(libs.hilt.compiler)
中的 build.gradle
更改为 :network
有效。确实如此。