使用Hilt无法创建ViewModel实例的问题及参数传递疑问
解决Hilt无法创建带参数ViewModel实例的问题
问题根源
你遇到的错误并非Hilt不支持带参构造的ViewModel,而是存在以下几个配置/代码错误:
修复步骤
1. 修正依赖版本不匹配
你使用的hilt-lifecycle-viewmodel是旧的alpha版本,与hilt-android:2.43.2兼容性存在问题,替换为稳定版:
implementation "com.google.dagger:hilt-android:2.43.2" annotationProcessor "com.google.dagger:hilt-android-compiler:2.43.2" implementation "androidx.hilt:hilt-lifecycle-viewmodel:1.0.0" // 移除alpha03后缀 annotationProcessor "androidx.hilt:hilt-compiler:1.0.0"
2. 匹配ViewModel构造参数的依赖类型
你的AppModule中提供的是CurrencyConverter接口的实例,但ViewModel构造函数中声明的依赖是具体实现类CurrencyConverterImpl,Hilt无法根据实现类找到对应的注入实例,修改ViewModel的参数类型为接口:
@HiltViewModel class CurrencyViewModel @Inject constructor( private val repository: CurrencyConverter, // 改为接口类型 private val dispatchers: DispatcherProvider ): ViewModel() { // 你的业务逻辑代码 }
3. 确保Application类添加Hilt注解
Hilt需要在Application类上添加@HiltAndroidApp完成初始化,这是容易遗漏的关键步骤:
@HiltAndroidApp class MyApplication : Application() { // 无需额外代码,Hilt会自动处理初始化 }
同时在AndroidManifest.xml中指定该Application类:
<application android:name=".MyApplication" <!-- 其他原有配置 --> > </application>
验证逻辑
完成以上修改后,Hilt会自动处理以下流程:
- 通过
AppModule提供CurrencyConverter和DispatcherProvider的单例实例 - 利用
@HiltViewModel和@Inject注解,将依赖注入到CurrencyViewModel的构造函数中 - 在
@AndroidEntryPoint标记的Activity中,通过by viewModels()获取到正确初始化的ViewModel实例
内容的提问来源于stack exchange,提问作者Alex20280
相关产品推荐
相关产品推荐

