Android MVVM:SavedStateHandle数据保存:和使用。
一、介绍
SavedStateHandle从名字可以看出,是保存状态的。这个类常和MVVM中的ViewModel搭配使用,对页面生命周期的数据状态的缓存与恢复做一个容器。这个容易相对onSaveInstanceState(Bundle)要更强一点,保存的数据类型也比较丰富,数据量也相对较大
二、分析
分析一个类,最简单的就是从源码看起:
2.1容器集合
-
regular = mutableMapOf
-
savedStateProviders = mutableMapOf
-
liveDatas = mutableMapOf
-
flows = mutableMapOf
以上都是map集合,都是用来存放key-value,四种集合对应四种不同的场景。
2.2 AIP的介绍
fun <K> set(key: String, value: K, bundle: Bundle) {
state.set(key, value)
state.setSavedStateProvider(key, MyProvider(bundle))
state.set(key, MyStateFlow<K>())
}
fun <M> get(key: String) {
state.get<M>(key)
state.getLiveData<M>(key)
var initialValue: M? = null
state.getLiveData(key, initialValue)
state.getStateFlow(key, initialValue)
}
通过数据保存,我们会发现,set的时候没有LiveData类型,那是因为在set的方法时,会对livedata集合进行单独处理
源码
三、类的介绍
3.1 SavedStateRegistry.SavedStateProvider
该类是一个接口,这个接口提供了一个方法,就是可以返回bundle对象。所以,原来的bundle对象是通过该方法进行保存
3.2 StateFlow
flow为流,stateflow为状态流。在软件生命周期中,字节和流一直是比较常见的资源,特别是流,可以伴随着任何业务和模块。
SavedStateHandle同样也支持流的保存。
关于SateFlow使用了out,我将对out和in做一下解释
out:
在 kotlin 中用 out 表示,kotlin 中的 “out T” 等同于 Java 的 <?extends T>
in:
在 kotlin 中用 in 表示,kotlin 中的 “in T” 等同于 Java 的 <?super T>
internal class MyStateFlow<out A> : StateFlow<A> {
//重复缓存的快照
override val replayCache: List<A>
get() = TODO("Not yet implemented")
/**
* 接受给定的收集器并将值发送到其中。要将值从共享流发送到特定收集器,可以使用collecter.emitAll(流)或collect{…}SAM转换。
共享流永远不会完成。对Flow.collector或共享流上的任何其他终端操作员的调用从未正常完成。
* */
override suspend fun collect(collector: FlowCollector<A>): Nothing {
TODO("Not yet implemented")
var a:A
collector.emit(a)
}
//此状态流的当前值
override val value: A
get() = TODO("Not yet implemented")
}
四、总结
在数据保存的地方,分两种保存方法,但是在数据存储的地方,分四种。所以,不管在保存还是恢复,都需要严格执行SavedStateHandle的规则。
关注公众号:Android老皮
解锁 《Android十大板块文档》 ,让学习更贴近未来实战。已形成PDF版
内容如下:
敲代码不易,关注一下吧。ღ( ´・ᴗ・` ) 🤔
这篇好文章是转载于:学新通技术网
- 版权申明: 本站部分内容来自互联网,仅供学习及演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,请提供相关证据及您的身份证明,我们将在收到邮件后48小时内删除。
- 本站站名: 学新通技术网
- 本文地址: /boutique/detail/tanhgbbgbj
系列文章
更多
同类精品
更多
-
photoshop保存的图片太大微信发不了怎么办
PHP中文网 06-15 -
Android 11 保存文件到外部存储,并分享文件
Luke 10-12 -
word里面弄一个表格后上面的标题会跑到下面怎么办
PHP中文网 06-20 -
《学习通》视频自动暂停处理方法
HelloWorld317 07-05 -
photoshop扩展功能面板显示灰色怎么办
PHP中文网 06-14 -
微信公众号没有声音提示怎么办
PHP中文网 03-31 -
excel下划线不显示怎么办
PHP中文网 06-23 -
怎样阻止微信小程序自动打开
PHP中文网 06-13 -
excel打印预览压线压字怎么办
PHP中文网 06-22 -
TikTok加速器哪个好免费的TK加速器推荐
TK小达人 10-01