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

使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.06 08:11:27