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

Jetpack Compose中Hilt注入ViewModel实例创建失败问题排查

问题描述

使用Android 14 API、Kotlin 2.0.0,通过Hilt实现依赖注入时,创建FirstViewModel抛出如下异常:

java.lang.RuntimeException: Cannot create an instance of class 
    ui.viewmodels.FirstViewModel
    ...
  Caused by: java.lang.NoSuchMethodException: 
    ui.viewmodels.FirstViewModel.<init> []
    at java.lang.Class.getConstructor0(Class.java:3325)
    at java.lang.Class.getDeclaredConstructor(Class.java:3063)
    at androidx.lifecycle.viewmodel.internal.JvmViewModelProviders.createViewModel(JvmViewModelProviders.kt:38)

已完成的配置包括:

  • 标注@HiltAndroidApp的Application类并在Manifest配置
  • 主Activity添加@AndroidEntryPoint注解
  • 定义DataModules提供FirstApi和FirstRepository单例
  • FirstViewModel标注@HiltViewModel并通过@Inject注入依赖
  • 在Composable中通过viewModel()获取实例
  • 模块级Gradle和版本目录的相关配置(见原提问代码)

问题分析与修复方案

核心问题是Hilt版本不一致+依赖配置错误,导致Hilt无法生成ViewModel的注入工厂类,最终触发无参构造找不到的异常。

1. 统一Hilt相关版本

你的版本目录中Hilt核心库、插件、编译器版本分散在2.44、2.48、2.51.1多个版本,编译期生成的代码会出现兼容性问题。

修复:

更新版本目录libs.versions.toml,统一所有Hilt相关版本:

[versions]
hilt = "2.51.1"
androidxHilt = "1.2.0"
kotlinKsp = "2.0.0" # 与你的Kotlin版本保持一致

[libraries]
hilt-android = { module = "com.google.dagger:hilt-android", version.ref = "hilt" }
hilt-compiler = { module = "com.google.dagger:hilt-compiler", version.ref = "hilt" }
hilt-android-testing = { module = "com.google.dagger:hilt-android-testing", version.ref = "hilt" }
androidx-hilt-compiler = { module = "androidx.hilt:hilt-compiler", version.ref = "androidxHilt" }
hilt-navigation-compose = { module = "androidx.hilt:hilt-navigation-compose", version.ref = "androidxHilt" }

[plugins]
dagger-hilt-android = { id = "com.google.dagger.hilt.android", version.ref = "hilt" }
kotlin-ksp = { id = "com.google.devtools.ksp", version.ref = "kotlinKsp" }

2. 修正模块级Gradle依赖配置

原配置存在冗余依赖和错误的编译器引入方式:

  • implementation(libs.hilt.compiler) 错误,编译器仅需通过KSP引入,无需添加到implementation依赖
  • 重复引入dagger-compiler和hilt-compiler,Hilt编译器已包含Dagger功能

修复:

修改模块级build.gradle.kts:

plugins {
    alias(libs.plugins.android.application) // 根据你的模块类型选择application或library
    alias(libs.plugins.kotlin.android)
    alias(libs.plugins.dagger.hilt.android)
    alias(libs.plugins.kotlin.ksp) // 启用KSP插件
}

dependencies {
    // Hilt核心库
    implementation(libs.hilt.android)
    // Hilt编译期处理器(必须通过KSP引入)
    ksp(libs.hilt.compiler)
    // AndroidX Hilt编译处理器(支持ViewModel/Navigation)
    ksp(libs.androidx.hilt.compiler)
    // Hilt Navigation Compose支持
    implementation(libs.hilt.navigation.compose)
    // 测试依赖
    androidTestImplementation(libs.hilt.android.testing)
    testImplementation(libs.hilt.android.testing)
}

3. 额外检查

  • 确保MyObject类符合Gson序列化要求(如有需要添加@SerializedName注解或默认构造),避免Retrofit初始化失败
  • 确认Composable函数是在@AndroidEntryPoint注解的Activity/Fragment的Compose树中调用

最终操作步骤
  1. 执行清理命令:./gradlew clean
  2. 重新构建项目:./gradlew assembleDebug
  3. 运行应用

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.22 08:36:04