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

Jetpack Compose中如何结合rememberSaveable使用mutableStateListOf?

最优实现方案

直接使用 Compose 官方提供的 listSaver 封装 mutableStateListOf 即可,无需自定义完整 Saver,也不用退回到不可变列表方案。

基础实现代码

import androidx.compose.runtime.saveable.listSaver
import androidx.compose.runtime.saveable.rememberSaveable
import androidx.compose.runtime.mutableStateListOf
import androidx.compose.runtime.snapshots.SnapshotStateList

// 存储String类型列表
val names = rememberSaveable(
    saver = listSaver(
        save = { stateList -> stateList.toList() },
        restore = { mutableStateListOf(*it.toTypedArray()) }
    )
) {
    mutableStateListOf()
}

// 原有增删操作完全不用修改
names.add("Bill")
names.remove("Bill")

如果你的列表存储的是自定义 Parcelable 对象,只需要确保对应数据类添加了 @Parcelize 注解实现 Parcelable 接口,上面的代码可以直接复用,不需要额外修改。


通用封装(可选)

如果多个页面都需要用到可保存的可变列表,可以封装为通用的顶层函数,减少重复代码:

import android.os.Parcelable
import androidx.compose.runtime.Composable
import androidx.compose.runtime.saveable.listSaver
import androidx.compose.runtime.saveable.rememberSaveable
import androidx.compose.runtime.mutableStateListOf
import androidx.compose.runtime.snapshots.SnapshotStateList

@Composable
fun <T : Parcelable> rememberSaveableMutableStateListOf(
    vararg elements: T
): SnapshotStateList<T> {
    return rememberSaveable(
        saver = listSaver(
            save = { stateList -> stateList.toList() },
            restore = { mutableStateListOf(*it.toTypedArray()) }
        )
    ) {
        mutableStateListOf(*elements)
    }
}

// 使用示例
val names = rememberSaveableMutableStateListOf<String>()
// User为添加了@Parcelize注解的Parcelable实现类
val userList = rememberSaveableMutableStateListOf<User>()

方案优势

  • 完全保留mutableStateListOf的可变操作API,原有业务逻辑无需修改
  • 依赖官方提供的Saver能力,无需手动实现复杂的状态保存逻辑
  • 性能和原生mutableStateListOf一致,不会出现不可变列表每次修改全量替换的性能损耗

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 20:39:01