当前位置: 代码网 > it编程>游戏开发>ar > Kotlin中 StateFlow 或 SharedFlow 的区别解析

Kotlin中 StateFlow 或 SharedFlow 的区别解析

2025年03月26日 ar 我要评论
stateflow 和 sharedflow 是 kotlin 协程(coroutines) 提供的两种 响应式数据流(reactive streams),用于在应用程序中处理异步数据流,类似于 rx

stateflowsharedflow 是 kotlin 协程(coroutines) 提供的两种 响应式数据流(reactive streams),用于在应用程序中处理异步数据流,类似于 rxjava 的 observableflowable,但更轻量且与 kotlin 协程深度集成。

1. stateflow(状态流)

stateflow 是一种 热流(hot flow),它会存储当前的状态值,并在状态变化时通知所有订阅者。

特点

  • 必须有初始值(不能为空)。
  • 只保留最新的值(新订阅者会立即收到当前值)。
  • sharedflow 的特殊情况(相当于 replay=1sharedflow)。
  • 适用于 ui 状态管理(如 viewmodel 暴露 ui 状态)。

示例

// 定义 stateflow(通常在 viewmodel 中)
private val _counterstate = mutablestateflow(0) // 初始值 0
val counterstate: stateflow<int> = _counterstate.asstateflow()
// 更新值
fun increment() {
    _counterstate.value++ // 自动通知所有订阅者
}
// 在 activity/fragment 中监听
lifecyclescope.launch {
    viewmodel.counterstate.collect { value ->
        textview.text = "count: $value"
    }
}

2. sharedflow(共享流)

sharedflow 也是一种 热流,但它不存储状态,而是用于 广播事件(如一次性事件、通知等)。

特点

  • 没有初始值(可以发送任意数量的数据)。
  • 可以配置缓存大小replay 控制新订阅者能收到多少历史数据)。
  • 适用于事件总线、通知等场景(如 toast 消息、导航事件)。

示例

// 定义 sharedflow(通常在 viewmodel 中)
private val _toastevent = mutablesharedflow<string>() // 无初始值
val toastevent: sharedflow<string> = _toastevent.assharedflow()
// 发送事件
fun showtoast(message: string) {
    viewmodelscope.launch {
        _toastevent.emit(message) // 发送事件
    }
}
// 在 activity/fragment 中监听
lifecyclescope.launch {
    viewmodel.toastevent.collect { message ->
        toast.maketext(this, message, toast.length_short).show()
    }
}

stateflow vs sharedflow

特性stateflowsharedflow
初始值✅ 必须有❌ 不需要
缓存历史数据仅最新值可配置 (replay)
适用场景ui 状态管理(如 livedata 替代)事件总线、通知
是否热流✅ 是✅ 是
线程安全✅ 是(协程作用域内)✅ 是

因此,以下面这段代码举例:

/**
     * 应用中心数据变化,更新应用中心小组件的显示
     */
    private fun widgetselectorviewmodel.observerapplist() = coroutinescope.launch {
        appwidgets.oneach { list ->
            log.d(tag, "observerapplist setdatalist")
            gridadapterapp.setdatalist(list)
            appitembinding?.groupnodata?.isvisible = list.isempty()
        }.launchin(coroutinescope)
    }  

功能总结:
这段代码的主要作用是监听应用小组件列表(appwidgets)的变化,每当列表更新时:

将新列表设置给网格适配器(gridadapterapp)以更新ui

根据列表是否为空来显示或隐藏"无数据"的提示

所有这些操作都在协程中异步执行

这是一种典型的响应式编程模式,通过观察数据流来自动更新ui,避免了手动刷新数据的需要。

首先是函数定义:

private fun widgetselectorviewmodel.observerapplist() = coroutinescope.launch {
  • 这是一个 widgetselectorviewmodel 的扩展函数
  • 函数是私有的(private)
  • 返回一个协程启动器(launch)
  • 函数名为 observerapplist(),表示它用于观察应用列表

其次是函数体:

appwidgets.oneach { list ->
    gridadapterapp.setdatalist(list)
    appitembinding?.groupnodata?.isvisible = list.isempty()
}.launchin(coroutinescope)
  • appwidgets 可能是一个 stateflowsharedflow(取决于它的定义)。
  • oneach 会在每次数据变化时执行,更新 ui。
  • launchin(coroutinescope) 表示在指定的协程作用域内启动这个流。

总结

  • stateflow → 用于 ui 状态管理(如 livedata 的替代)。
  • sharedflow → 用于 事件通知(如 toast、导航事件)。
  • 两者都是 热流,即使没有订阅者也会发送数据。
  • 通常结合 viewmodel + collect 使用,实现响应式 ui 更新。

如果你的 appwidgets 是一个应用列表的状态,那它更适合用 stateflow;如果是临时事件(如刷新完成通知),则更适合 sharedflow

到此这篇关于kotlin中 stateflow 或 sharedflow 的区别的文章就介绍到这了,更多相关kotlin stateflow 或 sharedflow 的区别内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!

(0)

相关文章:

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论

验证码:
Copyright © 2017-2025  代码网 保留所有权利. 粤ICP备2024248653号
站长QQ:2386932994 | 联系邮箱:2386932994@qq.com