在muableStateListOf中使用内存可保存 [英] Using rememberSaveable with mutableStateListOf

查看:27
本文介绍了在muableStateListOf中使用内存可保存的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在尝试将可打包对象的可变列表添加到我的Composable中。我还希望能够向其中添加对象和从中删除对象。

目前我使用的内容如下:

val names = remember { mutableStateListOf<String>() }

names.add("Bill")
names.remove("Bill")
现在,我希望此列表在配置更改后仍然有效,因此使用rememberSaveable可能是个好主意。可能是这样的:

val names = rememberSaveable { mutableStateListOf<String>() }

names.add("Bill")
names.remove("Bill")
但这不起作用,它会抛出以下异常: androidx.compose.runtime.snapshots.SnapshotStateList cannot be saved using the current SaveableStateRegistry. The default implementation only supports types which can be stored inside the Bundle. Please consider implementing a custom Saver for this class and pass it to rememberSaveable().

这意味着SnapshotStateList(mutableStateListOf的结果)不可保存。

到目前为止,我想出了几种方法来解决这个问题:

  1. 实际为SnapshotStateList实现存储程序。
  2. 使用类似val namesState = rememberSaveable { mutableStateOf(listOf<String>()) }的内容。 这确实可以完美地工作,但是更新列表需要设置值,这既慢又不方便(例如,只添加单个元素的namesState.value = namesState.value + "Joe")。

对于一项看似很小的任务来说,这两种方法似乎都太复杂了。我想知道做我想做的事最好的方法是什么。谢谢。

推荐答案

rememberrememberSaveable中不应该有您害怕丢失的数据:一旦您的视图消失,它就会被销毁。在这种情况下,请考虑使用view models


如果您仍然有兴趣将mutableStateListOf存储在rememberSaveable中,我建议您遵循错误建议,为SnapshotStateList创建一个Saver

@Composable
fun <T: Parcelable> rememberMutableStateListOf(vararg elements: T): SnapshotStateList<T> {
    return rememberSaveable(
        saver = listSaver(
            save = { it.toList() },
            restore = { it.toMutableStateList() }
        )
    ) {
        elements.toList().toMutableStateList()
    }
}

然后您可以这样使用它:

val names = rememberMutableStateListOf<String>()
LaunchedEffect(Unit) {
    names.add("Bill")
}
Text(names.joinToString { it })

此示例的预期行为:每次旋转设备时,都会再添加一个元素。

不要像添加和删除项时那样在Composable中使用任何状态修改。您应该只在side-effects内部执行该操作,就像我在这里使用LaunchedEffect所做的那样,或者像onClick这样进行回调。

请注意,saveableMutableStateListOf仍然仅限于可包保存的类型,如StringInt等。如果您需要在内部存储自定义类型,也需要修改Saver以保存/重新创建它。

这篇关于在muableStateListOf中使用内存可保存的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆