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树中调用
最终操作步骤
- 执行清理命令:
./gradlew clean - 重新构建项目:
./gradlew assembleDebug - 运行应用
内容的提问来源于stack exchange,提问作者succeed
相关产品推荐
相关产品推荐

