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
相关产品推荐
相关产品推荐

