集成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)
修复步骤
替换Composable中的ViewModel获取方式
默认的viewModel()方法不会调用Hilt的依赖注入容器,必须使用Hilt提供的hiltViewModel()来获取带注入的ViewModel实例。确认依赖与导入正确
确保已引入androidx.hilt:hilt-navigation-compose依赖,并在Composable文件中导入对应的方法:import androidx.hilt.navigation.compose.hiltViewModel验证Hilt基础配置
- 确认Application类添加了
@HiltAndroidApp注解 - 确认MainActivity添加了
@AndroidEntryPoint注解 - 确认ViewModel类的
@HiltViewModel注解、构造方法的@Inject修饰符都正确添加
- 确认Application类添加了
清理重建项目
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
相关产品推荐
相关产品推荐

