<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>StateFlow on opoojkk</title><link>https://opoojkk.com/tags/stateflow/</link><description>Recent content in StateFlow on opoojkk</description><generator>Hugo</generator><language>zh-CN</language><lastBuildDate>Sun, 29 Jun 2025 10:41:03 +0800</lastBuildDate><atom:link href="https://opoojkk.com/tags/stateflow/index.xml" rel="self" type="application/rss+xml"/><item><title>LiveData与StateFlow对比分析</title><link>https://opoojkk.com/posts/2025/06/29/the-difference-between-livedata-and-stateflow/</link><pubDate>Sun, 29 Jun 2025 10:41:03 +0800</pubDate><guid>https://opoojkk.com/posts/2025/06/29/the-difference-between-livedata-and-stateflow/</guid><description>&lt;p>之前写过LiveData的内部实现&lt;a href="https://opoojkk.com/posts/2024/11/10/jetpack-livedata/" title="LiveData">LiveData&lt;/a>，Jetpack中还有另一个组件StateFlow，两者作用非常类似，有什么差别呢？&lt;/p>
&lt;blockquote>
&lt;p>StateFlow、Flow 和 LiveData
StateFlow 和 LiveData 具有相似之处。两者都是可观察的数据容器类，并且在应用架构中使用时，两者都遵循相似模式。&lt;/p>
&lt;p>但请注意，StateFlow 和 LiveData 的行为确实有所不同：&lt;/p>
&lt;p>StateFlow 需要将初始状态传递给构造函数，而 LiveData 不需要。
当 View 进入 STOPPED 状态时，LiveData.observe() 会自动取消注册使用方，而从 StateFlow 或任何其他数据流收集数据的操作并不会自动停止。如需实现相同的行为，您需要从 Lifecycle.repeatOnLifecycle 块收集数据流。&lt;/p>
&lt;/blockquote>
&lt;p>这是&lt;a href="https://developer.android.com/kotlin/flow/stateflow-and-sharedflow?hl=zh-cn">Android Developer-StateFlow 和 SharedFlow&lt;/a>中写到的。&lt;/p>
&lt;p>的确LiveData构造方法中可以不传递值，为什么这么设计呢？我认为两者设计的用途是不同的。&lt;/p>
&lt;p>LiveData的不管是从名字还是实现上，真的很像是一个Data，内部有value，有版本，会让新增加的观察者保持最新的状态，也就是粘性事件（非要叫什么&amp;quot;数据倒灌&amp;quot;好显得高级- -）。一般会用需要传入LifeCycleOwn的方法注册观察者，因此生命周期是和LifeCycle绑定的，所以是live的。&lt;/p>
&lt;p>LiveData更新值时是需要在主线程执行的，上面的考虑在一起，它就是用来保持UI和一个数据的状态（粘性事件，最好不要执行逻辑）是同步的，因此是实现MVVM架构的一个关键部分。&lt;/p>
&lt;p>一个Data没有初始值，也很合理。&lt;/p>
&lt;p>那StateFlow呢？StateFlow首先是一个flow，在Kotlin中Flow最基本的作用是发送数据，StateFlow还是一个热流（观察者中只能收集到订阅之后的数据变化），不像冷流能接收到从最开始发送的数据。且是和生命周期没有关联的，有了协程的加持，使用的范围可以更大些，可以从其他子线程收集到之后发给任意线程，而不是仅限于主线程。&lt;/p>
&lt;p>State能没有初始值吗，听起来不太合适。&lt;/p>
&lt;p>StateFlow能替换LiveData吗？我认为的是可以的。&lt;/p>
&lt;p>LiveData两大特点分别是和生命周期绑定、粘性事件。生命周期StateFlow借助扩展函数repeatOnLifecycle可以做到，粘性事件也是本身就支持的。&lt;/p>
&lt;p>但是，LiveData不需要借助协程，开箱即用，有更具体的使用场景。&lt;/p></description></item></channel></rss>