Android Hilt ViewModel无零参构造无法创建实例崩溃修复
问题根因
这个崩溃是ViewModel初始化逻辑和Hilt依赖注入链路断裂导致的:
- 未做特殊配置时,Android组件初始化ViewModel默认会通过反射调用ViewModel的零参数构造函数创建实例,你的MenstrualViewModel仅定义了带FirebaseUtil、RemoteRepository两个入参的构造函数,没有零参构造,自然会抛出InstantiationException,触发实例创建失败的崩溃。
- 你虽然在ViewModel构造函数上添加了
@Inject注解声明依赖,但类上方的@HiltViewModel注解被注释后,Hilt不会为该ViewModel生成绑定了依赖的自定义ViewModelFactory,ViewModelProvider拿不到自定义工厂就会走默认的反射创建逻辑,最终触发崩溃。
修复方案
按以下步骤逐一检查修改即可解决问题:
- 恢复MenstrualViewModel类上方的
@HiltViewModel注解,不要注释该注解,参考正确写法:
@HiltViewModel // 该注解不能注释、不能遗漏 class MenstrualViewModel @Inject constructor( private val firebaseUtil: FirebaseUtil, private val remoteRepository: RemoteRepository ) : ViewModel() { // 页面业务逻辑写在这里 }
- 检查承载该ViewModel的MenstrualFragment:
- 类上方必须添加
@AndroidEntryPoint注解,标记为Hilt注入入口 - 初始化ViewModel时使用
by viewModels()委托获取实例,禁止手动调用构造函数new实例,参考写法:
@AndroidEntryPoint class MenstrualFragment : Fragment() { private val viewModel: MenstrualViewModel by viewModels() // 其余页面生命周期、视图逻辑 } - 类上方必须添加
- 检查两个依赖项的注入配置:
FirebaseUtil和RemoteRepository要么在自身类构造函数上加@Inject标记为可注入,要么在Hilt的Module中通过@Provides/@Binds方法提供实例,避免Hilt找不到对应依赖抛出注入失败错误。 - 执行Android Studio的
Build > Clean Project后重新编译运行即可。
注意事项
@HiltViewModel是Hilt识别ViewModel、生成对应依赖注入工厂的核心标记,所有通过Hilt注入依赖的ViewModel都必须添加该注解,不能遗漏或注释。- 如果ViewModel是在Activity中使用,对应的Activity类也必须添加
@AndroidEntryPoint注解,否则注入链路同样会断裂。
内容的提问来源于stack exchange,提问作者Varsha Myadam
相关产品推荐
相关产品推荐

