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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.16 11:21:02