深入理解StateFlow

开篇

flow api 已经慢慢被谷歌列为数据流的首选,可以见到官网的数据流篇都慢慢偏向于flow api,虽然LiveData等数据流类型已经深入开发者观念中,但是flow api也正慢慢的崛起出自己的市场。本篇讲的StateFlow是flow api中的一个更偏向于应用层的api,功能也非常和LiveData相似,那么为什么要出一个和LiveData类似的东西的,因为LiveData天生就引入了生命周期相关的概念,从设计角度出发,其实是耦合了生命周期这部分,所以现在才另起炉灶,出现了StateFlow。

接口部分

public interface StateFlow : SharedFlow {/*** 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 flowval counter = _counter.asStateFlow() // publicly exposed as read-only state flowfun inc() {_counter.value++}
}

所以按照数据划分,它就可以属于热流,当然冷流热流本质是一个概念,便于区分即可。

发送者部分

为了方便分析,我们将数据改变部分称为发送者部分,每个对value进行set操作时都会进入下面方法。

private fun updateState


本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!

相关文章

立即
投稿

微信公众账号

微信扫一扫加关注

返回
顶部