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

