it编程 > 游戏开发 > ar

Kotlin中 StateFlow 或 SharedFlow 的区别解析

66人参与 2025-03-26 ar

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

1. stateflow(状态流)

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

特点

示例

// 定义 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 也是一种 热流,但它不存储状态,而是用于 广播事件(如一次性事件、通知等)。

特点

示例

// 定义 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 {

其次是函数体:

appwidgets.oneach { list ->
    gridadapterapp.setdatalist(list)
    appitembinding?.groupnodata?.isvisible = list.isempty()
}.launchin(coroutinescope)

总结

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

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

(0)
打赏 微信扫一扫 微信扫一扫

您想发表意见!!点此发布评论

推荐阅读

requests库post方法如何传params类型的参数(最新推荐)

03-26

华硕ProArt Z890-Creator WiFi主板测评:创作者的硬核搭档!

03-25

华硕ProArt 全家桶装机推荐: 拥有RTX5080的生产力主机

03-25

关于连接池详解(HikariCP、Druid)

03-28

可观测性-Metrics-数据库连接池HikariCP监控教程

03-28

HarmonyOS Next音乐播放器项目实现代码

03-23

猜你喜欢

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

发表评论