You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用Retrofit、Dagger Hilt与Repository模式获取API数据遇依赖问题求助

问题分析与解决方案

核心问题定位

从错误信息来看,核心问题是Dagger Hilt的Singleton注解包冲突——你的代码中混用了jakarta.inject.Singleton和Hilt默认依赖的javax.inject.Singleton,导致依赖注入容器无法正确识别注解规则,进而无法完成CryptoRepository的注入。

具体修复步骤

1. 统一Singleton注解的导入

检查NetworkModule、RepositoryModule所有使用@Singleton的文件,确保导入的是javax.inject.Singleton,而非jakarta.inject.Singleton:

// 正确导入语句,替换掉jakarta相关的导入
import javax.inject.Singleton

2. 确认Application类的Hilt初始化配置

必须在自定义Application类上添加@HiltAndroidApp注解,这是Hilt启动依赖注入容器的核心入口:

@HiltAndroidApp
class CryptoApp : Application() {
    // 无需额外逻辑,Hilt会自动完成初始化
}

同时在AndroidManifest.xml中指定这个Application类:

<application
    android:name=".CryptoApp"
    <!-- 其他原有配置 -->
>

3. 检查依赖库版本兼容性

确保项目中Hilt、Retrofit等核心依赖版本匹配,避免因版本差异导致的注解包冲突。推荐的依赖配置示例(模块级build.gradle):

plugins {
    id 'com.android.application'
    id 'org.jetbrains.kotlin.android'
    id 'kotlin-kapt'
    id 'com.google.dagger.hilt.android'
}

dependencies {
    // Hilt核心依赖
    implementation 'com.google.dagger:hilt-android:2.48'
    kapt 'com.google.dagger:hilt-android-compiler:2.48'
    
    // Retrofit相关
    implementation 'com.squareup.retrofit2:retrofit:2.9.0'
    implementation 'com.squareup.retrofit2:converter-gson:2.9.0'
    implementation 'com.squareup.okhttp3:okhttp:4.11.0'
}

注意:不要主动引入jakarta.inject相关依赖,Android环境下Hilt默认依赖javax.inject。

4. 优化Repository注入方式(可选)

你当前的RepositoryModule写法可行,但可以改用@Binds注解简化代码,无需手动实例化实现类:

@Module
@InstallIn(SingletonComponent::class)
abstract class RepositoryModule {
    @Binds
    @Singleton
    abstract fun bindCryptoRepository(impl: CryptoRepositoryImpl): CryptoRepository
}

这种方式更符合Hilt的最佳实践,由Hilt自动处理依赖注入逻辑。

5. 清理缓存并重构项目

执行以下操作确保旧缓存被清除:

  • 点击Android Studio顶部菜单 Build > Clean Project
  • 接着执行 Build > Rebuild Project
  • 若仍有问题,执行 File > Invalidate Caches... > Invalidate and Restart

验证注入有效性

在需要注入CryptoRepository的ViewModel中,确保添加@HiltViewModel注解:

@HiltViewModel
class CryptoViewModel @Inject constructor(
    private val repository: CryptoRepository
) : ViewModel() {
    fun loadCoins() {
        viewModelScope.launch {
            val coins = repository.getCoins()
            // 数据处理逻辑
        }
    }
}

内容的提问来源于stack exchange,提问作者Muhammet Sarisoy

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.14 18:05:10