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

Jetpack Compose使用Live Edit时ViewModel生命周期异常问题咨询

ViewModel重复创建与Live Edit崩溃问题解答

1. ViewModel重复创建、onCleared未调用问题

该现象是Android Studio Live Editor 开发调试阶段的已知限制,不属于配置遗漏问题,也不会在正式发布的应用中出现。
Live Editor 执行增量代码推送时,会临时持有旧的Composable树快照,旧ViewModel实例被快照引用无法被回收,因此不会触发onCleared,同时新的重组树会创建新的ViewModel实例,是开发阶段的正常行为,无需修改业务代码,关闭Live Editor使用普通部署流程即可避免该现象。

2. 快照读取异常崩溃问题

报错reading a state that was created after the snapshot was taken or in a snapshot that has not yet been applied的核心原因是:你的PreferenceRepository.accessToken属性被封装为了Compose State类型,当Live Edit触发新ViewModel初始化时,init块的代码运行在Compose快照的提交线程上下文中,此时直接读取还未完成提交的State属性就会触发该异常。
你将viewModelScope替换为GlobalScope后崩溃消失,是因为GlobalScope的协程脱离了当前Compose的快照线程上下文,避开了快照状态检查,但GlobalScope存在内存泄漏风险,不推荐作为最终解决方案。

推荐修复方案

  • 存储层与UI层解耦:不要让PreferenceRepository直接暴露Compose State类型给ViewModel,改为暴露Flow、普通挂起方法或同步方法,避免业务层和Compose快照机制耦合。
  • 调整token读取逻辑:将拦截器中token的读取逻辑放到独立的协程上下文中执行,示例如下:
init {
    viewModelScope.launch(Dispatchers.IO) {
        val token = get<PreferenceRepository>().accessToken
        httpClient.addInterceptor { chain ->
            val request = chain.request()
                .newBuilder()
                .addHeader("Authorization", "Bearer $token")
                .build()
            chain.proceed(request)
        }
    }
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.05 02:18:00