深入理解StateFlow

本文深入探讨了StateFlow在Android开发中的作用,作为Flow API的一种,它与LiveData相似但避免了生命周期的耦合。StateFlow提供了一个可以直接修改的`value`属性,其数据改变不依赖于`collect`方法,使得它在某些场景下被视为热流。文章分析了StateFlow的接口、发送者和订阅者部分,解释了StateFlowSlot在多线程和协程中的作用,以及如何确保状态的正确更改。最后,作者提到了StateFlow与LiveData在回调机制上的差异,并提供了相关项目的链接供读者参考。
摘要由CSDN通过智能技术生成

开篇

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
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值