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

向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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.28 22:25:36