如何将非Android模块中的Retrofit提供给Android模块?

问题描述 投票:0回答:1

让我说得更清楚:

我有一个多模块应用程序。有

: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 在幕后如何工作的来龙去脉。

dagger-2 dagger-hilt
1个回答
0
投票

将我的

ksp(libs.dagger.compiler)
模块的
ksp(libs.hilt.compiler)
中的
build.gradle
更改为
:network
有效。确实如此。

© www.soinside.com 2019 - 2024. All rights reserved.