向MainActivity内函数注入ViewModel后程序崩溃求助
问题原因
崩溃核心原因是Compose预览使用的PreviewActivity未被@AndroidEntryPoint注解,无法提供Hilt依赖注入所需的容器环境。当预览函数GreetingPreview调用test123()时,默认执行hiltViewModel()尝试从Hilt容器获取ViewModel,但PreviewActivity并非Hilt生成的组件,因此抛出IllegalStateException。
解决方案
方案1:预览时传入ViewModel的模拟实例
在预览函数中手动传入Mock的ViewModel实例,绕过Hilt注入:
// 先创建Mock实现(假设MainRepository和LocationClient是接口) class MockMainRepository : MainRepository { // 实现接口方法,返回模拟数据 } class MockLocationClient : LocationClient { // 实现接口方法,返回模拟地理位置 } @Preview(showBackground = true) @Composable fun GreetingPreview() { SomeTheme { test123( viewModel = MyViewModel( repository = MockMainRepository(), location = MockLocationClient() ) ) } }
预览时直接使用模拟实例,无需依赖Hilt容器。
方案2:根据预览模式自动切换ViewModel来源
利用LocalInspectionMode.current判断是否处于预览模式,动态提供ViewModel:
@OptIn(ExperimentalPermissionsApi::class) @Composable fun test123( viewModel: MyViewModel = if (!LocalInspectionMode.current) { // 正常运行时使用Hilt注入的ViewModel hiltViewModel() } else { // 预览时使用模拟实例 MyViewModel( repository = MockMainRepository(), location = MockLocationClient() ) } ) { // 你的Composable内容 }
这种方式无需修改预览函数,自动适配运行和预览两种场景。
方案3:临时禁用预览(应急用)
如果只是快速调试UI,可以暂时注释掉预览函数中的test123()调用,或替换为不依赖ViewModel的UI片段,但这不是长期解决方案。
额外注意事项
- 确保
MainRepository和LocationClient已被Hilt正确绑定(比如通过@Inject构造函数或@Module提供实例),否则正常运行时也会出现注入错误。 - 预览模式下无法使用真实的Hilt依赖,必须通过模拟实例隔离依赖。
内容的提问来源于stack exchange,提问作者SzypkiAleWolnyIDK
相关产品推荐
相关产品推荐

