gpt4 book ai didi

android - 将 rememberSaveable 与 mutableStateListOf 一起使用

转载 作者:行者123 更新时间:2023-12-04 23:40:20 25 4
gpt4 key购买 nike

我正在尝试将可变的可打包对象列表添加到我的可组合项中。我还希望能够向其中添加对象和从中删除对象。
目前我正在使用这样的东西:

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 的结果)不可保存。
到目前为止,我可以想到几种解决方法:
  • 实际为 SnapshotStateList 实现保护程序.
  • 使用类似 val namesState = rememberSaveable { mutableStateOf(listOf<String>()) } .
    这确实完美无缺,但是更新列表需要设置值,这既慢又不方便(例如 namesState.value = namesState.value + "Joe" 仅用于添加单个元素)。

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

    最佳答案

    remember 里面应该没有数据或 rememberSaveable你害怕失去的东西:一旦你的视野消失,它就会被摧毁。考虑使用 view models在这种情况下。

    如果您仍有兴趣存储 mutableStateListOf里面 rememberSaveable , 我建议你按照你的错误建议创建一个 Saver对于 SnapshotStateList :

    @Composable
    fun <T: Any> rememberMutableStateListOf(vararg elements: T): SnapshotStateList<T> {
    return rememberSaveable(
    saver = listSaver(
    save = { stateList ->
    if (stateList.isNotEmpty()) {
    val first = stateList.first()
    if (!canBeSaved(first)) {
    throw IllegalStateException("${first::class} cannot be saved. By default only types which can be stored in the Bundle class can be saved.")
    }
    }
    stateList.toList()
    },
    restore = { it.toMutableStateList() }
    )
    ) {
    elements.toList().toMutableStateList()
    }
    }
    然后你可以像这样使用它:
    val names = rememberMutableStateListOf<String>()
    LaunchedEffect(Unit) {
    names.add("Bill")
    }
    Text(names.joinToString { it })
    此示例的预期行为:每次旋转设备时 - 都会添加一个元素。
    不要像添加和删除项目时那样在可组合项中使用任何状态修改。你应该只在 side-effects 内这样做。 ,就像我在这里做的 LaunchedEffect ,或回调,如 onClick .
    请注意 saveableMutableStateListOf它仍然仅限于 Bundle-saveable 类型,例如 String , Int等。如果需要在里面存储自定义类型,则需要修改 Saver也保存/重新创建它。

    关于android - 将 rememberSaveable 与 mutableStateListOf 一起使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68885154/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com