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

集成Proto DataStore与Hilt后App崩溃,无法创建ViewModel实例

问题:Hilt无法注入SchoolViewModel,提示找不到无参构造方法

问题背景

App原本运行正常,集成Proto DataStore和Hilt依赖注入后,SchoolViewModel无法实例化并触发崩溃。该ViewModel通过构造方法注入DataStore实例,已添加@HiltViewModel注解,但系统仍尝试寻找无参构造方法导致失败。

关键报错日志

Caused by: java.lang.NoSuchMethodException: com.sogaban.mhtcompanion.presentation.models.SchoolViewModel.<init> []
    at java.lang.Class.getConstructor0(Class.java:2332)
    at java.lang.Class.getDeclaredConstructor(Class.java:2170)
    at androidx.lifecycle.ViewModelProvider$NewInstanceFactory.create(ViewModelProvider.kt:202)

修复步骤

  1. 替换Composable中的ViewModel获取方式
    默认的viewModel()方法不会调用Hilt的依赖注入容器,必须使用Hilt提供的hiltViewModel()来获取带注入的ViewModel实例。

  2. 确认依赖与导入正确
    确保已引入androidx.hilt:hilt-navigation-compose依赖,并在Composable文件中导入对应的方法:

    import androidx.hilt.navigation.compose.hiltViewModel
    
  3. 验证Hilt基础配置

    • 确认Application类添加了@HiltAndroidApp注解
    • 确认MainActivity添加了@AndroidEntryPoint注解
    • 确认ViewModel类的@HiltViewModel注解、构造方法的@Inject修饰符都正确添加
  4. 清理重建项目
    KAPT生成的Hilt注入代码可能未及时更新,执行Clean Project后再Rebuild Project,确保注入逻辑代码正确生成。

代码修正示例

修改SchoolScreen Composable

// 导入Hilt专属的ViewModel获取方法
import androidx.hilt.navigation.compose.hiltViewModel

@Composable
fun SchoolScreen(
    modifier: Modifier = Modifier,
    // 使用hiltViewModel()替代默认的viewModel()
    viewModel: SchoolViewModel = hiltViewModel()
) {
    val schoolStates = viewModel.stateSchool.collectAsStateWithLifecycle()
    
    // 剩余业务代码...
}

额外检查点

  • 确认AppModule中provideProtoDataStore方法提供的DataStore<SchoolPreferencesParams>实例可以被Hilt正确识别并注入
  • 确保Proto序列化器SchoolPreferencesSerializer实现无语法错误,可正常生成DataStore实例

内容的提问来源于stack exchange,提问作者TheSelfTaughtNoob

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.15 15:24:51