Jetpack Compose中用rememberSave与ListSaver实现mutableListOf状态持久化
实现配置变更状态持久化的方案
1. 核心问题说明
你的代码里用remember保存的MutableList<Score>在配置变更(比如旋转屏幕)时会丢失状态,因为MutableList和自定义Score类不属于Jetpack Compose默认支持自动持久化的类型,必须通过自定义Saver来实现转换逻辑。
2. 自定义Saver实现步骤
我们用ListSaver来处理整个列表的保存与恢复:
- 保存逻辑:将每个
Score实例拆解为可持久化的基础类型(String、Int)组成的列表,最终生成一个二维列表 - 恢复逻辑:遍历保存的二维列表,把每个子列表重新组装为
Score实例,再转换成MutableList
完整代码示例
data class Score( val name: String, var play: Int, var out: Int, var total: Int, var prev: Int ) // 自定义Saver,处理MutableList<Score>的持久化与恢复 val scoreListSaver = ListSaver<MutableList<Score>, List<Any?>>( save = { scoreList -> scoreList.map { score -> listOf(score.name, score.play, score.out, score.total, score.prev) } }, restore = { savedData -> savedData.map { item -> Score( name = item[0] as String, play = item[1] as Int, out = item[2] as Int, total = item[3] as Int, prev = item[4] as Int ) }.toMutableList() } ) // 在Composable中替换remember为rememberSaveable并传入自定义Saver var players = rememberSaveable(saver = scoreListSaver) { mutableListOf( Score("Player A", 0, 0, 0, 0), Score("Player B", 0, 0, 0, 0), Score("Player C", 0, 0, 0, 0) ) }
关键注意事项
- 必须确保所有被保存的属性都是Jetpack Compose支持的基础类型(String、Int、Boolean等),如果后续给
Score新增字段,要同步更新Saver的保存和恢复逻辑 - 如果你需要修改
Score的属性值,直接修改即可,rememberSaveable会在配置变更时自动触发保存逻辑
内容的提问来源于stack exchange,提问作者Des Albert
相关产品推荐
相关产品推荐

