Using rememberSaveable with mutableStateListOf(在muableStateListOf中使用内存可保存)
本文介绍了在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
的结果)不可保存。
到目前为止,我想出了几种方法来解决这个问题:
- 实际为
SnapshotStateList
实现存储程序。 - 使用类似
val namesState = rememberSaveable { mutableStateOf(listOf<String>()) }
的内容。 这确实可以完美地工作,但是更新列表需要设置值,这既慢又不方便(例如,只添加单个元素的namesState.value = namesState.value + "Joe"
)。
对于一项看似很小的任务来说,这两种方法似乎都太复杂了。我想知道做我想做的事最好的方法是什么。谢谢。
推荐答案
remember
或rememberSaveable
中不应该有您害怕丢失的数据:一旦您的视图消失,它就会被销毁。在这种情况下,请考虑使用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
仍然仅限于可包保存的类型,如String
、Int
等。如果您需要在内部存储自定义类型,也需要修改Saver
以保存/重新创建它。
这篇关于在muableStateListOf中使用内存可保存的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持编程学习网!
沃梦达教程
本文标题为:在muableStateListOf中使用内存可保存
基础教程推荐
猜你喜欢
- android 应用程序已发布,但在 google play 中找不到 2022-01-01
- UIWebView 委托方法 shouldStartLoadWithRequest:在 WKWebView 中等效? 2022-01-01
- Kivy Buildozer 无法构建 apk,命令失败:./distribute.sh -m “kivy"d 2022-01-01
- 当从同一个组件调用时,两个 IBAction 触发的顺序是什么? 2022-01-01
- 如何在 iPhone 上显示来自 API 的 HTML 文本? 2022-01-01
- Android:对话框关闭而不调用关闭 2022-01-01
- 在 gmail 中为 ios 应用程序检索朋友的朋友 2022-01-01
- 如何在没有IB的情况下将2个按钮添加到右侧的UINavigationbar? 2022-01-01
- 如何让对象对 Cocos2D 中的触摸做出反应? 2022-01-01
- 如何在 UIImageView 中异步加载图像? 2022-01-01