Kotlin+Hilt环境下HomeViewModel无法实例化的RuntimeException问题
可能的原因及修复方案
1. 检查Application类是否添加@HiltAndroidApp注解
Hilt必须通过Application类初始化注入框架,若未添加该注解,Hilt无法生成必要的注入代码。
示例代码:
@HiltAndroidApp class MyApp : Application() { // 自定义逻辑 }
同时需在AndroidManifest.xml中指定该Application:
<application android:name=".MyApp" <!-- 其他配置项 --> >
2. 确认GetTrendingMoviesUseCase的注入有效性
GetTrendingMoviesUseCase已使用@Inject constructor,但需确保它处于Hilt默认扫描范围内(@HiltAndroidApp所在包或子包)。若不在该范围,需在Hilt模块中手动绑定,或调整包结构。
3. 检查MovieRepository的绑定配置
GetTrendingMoviesUseCase依赖MovieRepository,如果MovieRepository是接口,必须在Hilt模块中提供具体实现的绑定:
@Module @InstallIn(SingletonComponent::class) object RepositoryModule { @Provides fun provideMovieRepository(apiService: ApiService): MovieRepository { return MovieRepositoryImpl(apiService) } }
如果是具体类,需确保它有@Inject constructor注解,或在模块中被提供。
4. 检查MovieItemDecider的注入配置
MovieResponseDtoToDomain依赖MovieItemDecider,需确保该类已被Hilt管理:
- 若为具体类,添加
@Inject constructor:
class MovieItemDecider @Inject constructor() { // 方法实现 }
- 若为接口,需在Hilt模块中绑定具体实现类。
5. 验证Gradle配置是否正确
确保项目已添加完整的Hilt依赖:
项目级build.gradle:
plugins { id 'com.google.dagger.hilt.android' version '2.48' apply false }
模块级build.gradle:
plugins { id 'kotlin-kapt' id 'com.google.dagger.hilt.android' } dependencies { implementation 'com.google.dagger:hilt-android:2.48' kapt 'com.google.dagger:hilt-compiler:2.48' implementation 'androidx.hilt:hilt-lifecycle-viewmodel:1.0.0-alpha03' kapt 'androidx.hilt:hilt-compiler:1.0.0' } kapt { correctErrorTypes true }
注意保持版本一致,避免依赖冲突。
6. 清理重建项目
Hilt注解处理器生成的代码可能存在缓存问题,执行Clean Project后再Rebuild Project,可解决部分编译时注入异常。
总结
最可能的问题是依赖链中的某个类(如MovieRepository、MovieItemDecider)未被Hilt正确绑定,或Application类缺失@HiltAndroidApp注解。按上述步骤逐一排查即可解决ViewModel实例创建失败的问题。
内容的提问来源于stack exchange,提问作者İbrahim Uyar

