开篇
flow api 已经慢慢被谷歌列为数据流的首选,可以见到官网的数据流篇都慢慢偏向于flow api,虽然LiveData等数据流类型已经深入开发者观念中,但是flow api也正慢慢的崛起出自己的市场。本篇讲的StateFlow是flow api中的一个更偏向于应用层的api,功能也非常和LiveData相似,那么为什么要出一个和LiveData类似的东西的,因为LiveData天生就引入了生命周期相关的概念,从设计角度出发,其实是耦合了生命周期这部分,所以现在才另起炉灶,出现了StateFlow。
接口部分
public interface StateFlow<out T> : SharedFlow<T> {
/**
* The current value of this state flow.
*/
public val value: T
}
可以看到StateFlow在SharedFlow上层上添加了一个属性,就是value值,可以被认为当前是当前可观测的值,跟LiveData的value类似。StateFlow更加推崇的是单体状态,所以区别于一般的flowapi(主要是数据流状态),它的实现禁止了一个重置操作。
StateFlowImpl 中
@Suppress("UNCHECKED_CAST")
override fun resetReplayCache() {
throw UnsupportedOperationException("MutableStateFlow.resetReplayCache is not supported")
}
还有就是一般的flow属于冷流,冷流这个概念就不再赘述,而flow之所以是冷流,是因为只有在collect的时候间接通过flowcollecter的emit方法去产生数据,本质上数据的改变依赖收集者,所以才是冷流,具体分析可以下看上一篇文章 juejin.cn/post/705860…
而StateFlow继承于SharedFlow,并且value数值是不依赖于collect方法改变,简单来说,就是收集者可以改变value数值,但是StateFlow中的value改变并不是只有这一种手段【注意这里概念】,它还可以直接对value数据改变,如下面例子
class CounterModel {
private val _counter = MutableStateFlow(0) // private mutable state flow
val counter = _counter.asStateFlow() // publicly exposed as read-only state flow
fun inc() {
_counter.value++
}
}
所以按照数据划分,它就可以属于热流,当然冷流热流本质是一个概念,便于区分即可。
发送者部分
为了方便分析,我们将数据改变部分称为发送者部分,每个对value进行set操作时都会进入下面方法。
private fun updat