66人参与 • 2025-03-26 • ar
stateflow
和 sharedflow
是 kotlin 协程(coroutines) 提供的两种 响应式数据流(reactive streams),用于在应用程序中处理异步数据流,类似于 rxjava 的 observable
或 flowable
,但更轻量且与 kotlin 协程深度集成。
stateflow
是一种 热流(hot flow),它会存储当前的状态值,并在状态变化时通知所有订阅者。
特点
sharedflow
的特殊情况(相当于 replay=1
的 sharedflow
)。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" } }
sharedflow
也是一种 热流,但它不存储状态,而是用于 广播事件(如一次性事件、通知等)。
特点
replay
控制新订阅者能收到多少历史数据)。示例
// 定义 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
特性 | stateflow | sharedflow |
---|---|---|
初始值 | ✅ 必须有 | ❌ 不需要 |
缓存历史数据 | 仅最新值 | 可配置 (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
(取决于它的定义)。oneach
会在每次数据变化时执行,更新 ui。launchin(coroutinescope)
表示在指定的协程作用域内启动这个流。stateflow
→ 用于 ui 状态管理(如 livedata
的替代)。sharedflow
→ 用于 事件通知(如 toast、导航事件)。viewmodel
+ collect
使用,实现响应式 ui 更新。如果你的 appwidgets
是一个应用列表的状态,那它更适合用 stateflow
;如果是临时事件(如刷新完成通知),则更适合 sharedflow
。
到此这篇关于kotlin中 stateflow 或 sharedflow 的区别的文章就介绍到这了,更多相关kotlin stateflow 或 sharedflow 的区别内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!
您想发表意见!!点此发布评论
版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。
发表评论