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

