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

Jetpack Compose中使用rememberSaveable()导致应用退至后台时崩溃的问题

解决Compose 1.0.0-beta01中rememberSaveable导致后台崩溃的问题

刚踩过完全一样的坑,给你说下快速修复方案和背后的原因:

直接修复代码

把你的状态声明改成以下写法,显式指定mutableStateSaver即可解决崩溃:

var email by rememberSaveable(stateSaver = mutableStateSaver()) { mutableStateOf("") }

或者更简洁的等价写法:

var email by rememberSaveable(saver = mutableStateSaver()) { mutableStateOf("") }

崩溃原因拆解

你看到的Parcel: unable to marshal value androidx.compose.runtime.SnapshotMutableStateImpl@efa375c报错,核心逻辑是:

  • rememberSaveable的核心作用是在Activity/Compose组件被系统后台销毁重建时保留状态,它会把状态数据写入Android的Bundle,这要求数据必须支持序列化(实现Parcelable或Serializable接口)。
  • 在Compose 1.0.0-beta01这个版本里,mutableStateOf()返回的SnapshotMutableStateImpl对象没有正确实现Parcelable序列化逻辑,当系统尝试把它写入Parcel时就会触发崩溃。
  • 而remember()只把状态存在内存中,不需要序列化操作,所以换成它就不会出问题——但代价是后台销毁后状态会丢失,这显然不是我们使用rememberSaveable的初衷。

额外说明

mutableStateSaver()是Compose官方提供的专门用于保存MutableState的工具,它不会去序列化SnapshotMutableStateImpl对象本身,而是序列化状态里的实际值(比如你的空字符串),完美避开了对象序列化的问题。

另外这个bug在后续的Compose版本中已经被修复,如果项目允许的话,升级到1.0.0正式版及以后的稳定版本,也能彻底解决这个问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.29 11:27:32