当前位置: 首页 > news >正文

为什么要使用 .asStateFlow() 而不是直接赋值?

记录开发过程中疑问,如果说的不对,欢迎提出修改

这里我使用了两个MutableStateFlow和两个StateFlow做说明,其中strList是由_strList.asStateFlow()赋值,而str2List_strList直接赋值。这两种在代码运行都能正常运行,这也是为什么我对此有疑问,从而做下笔记梳理

示例代码及运行结果

private val _strList = MutableStateFlow<List<String>>(listOf("A", "B", "C"))
val strList: StateFlow<List<String>> = _strList.asStateFlow()private val _str2List = MutableStateFlow<List<String>>(listOf("X", "Y", "Z"))
val str2List: StateFlow<List<String>> = _str2List@Test
fun testAsStateFlow() = runTest {launch {strList.collect { println("strList 收到新值: $it") }}launch {delay(500) (strList as? MutableStateFlow)?.value = listOf("A", "B", "C", "D")}launch {str2List.collect { println("str2List 收到新值: $it") }}launch {delay(500)(str2List as? MutableStateFlow)?.value = listOf("A", "X", "Y", "Z")}
}

下面是运行结果,可以看出通过.asStateFlow() 赋值的strList 无法直接通过asStateFlow转换从而修改参数,而str2List却可以

strList 收到新值: [A, B, C]

str2List 收到新值: [X, Y, Z]

str2List 收到新值: [A, X, Y, Z]

1. 什么是 MutableStateFlowStateFlow

  • MutableStateFlow 是一种可变的状态流,它允许我们通过 value 属性修改流中的状态。
  • StateFlow 是一种不可变的状态流,它只暴露给外部读取状态的能力,而不能修改状态。

通常,在封装状态时,我们将 MutableStateFlow 定义为私有属性(例如 _strList),而将其暴露为不可变的 StateFlow(例如 strList),这样外部代码只能读取状态,而无法修改它。

2. 为什么不建议直接赋值?

在上述代码中,如果直接将 _strList_str2List 作为 StateFlow 来暴露,会导致外部代码可以通过强制转换或直接访问 _strList_str2List 来修改其值。这样可能会破坏状态的不可变性,导致不可预测的副作用或状态变更。

例如,在以下代码中,尝试直接修改 strList 的值:

(strList as? MutableStateFlow)?.value = listOf("A", "B", "C", "D")

虽然 strListStateFlow 类型,它不能直接修改,但通过强制转换为 MutableStateFlow 类型,代码可以绕过不可变性并直接修改 value 属性。这违背了状态不可变性的设计原则,容易导致不可控的状态更改。

3. asStateFlow 的作用

使用 asStateFlow() 方法可以将 MutableStateFlow 转换为不可变的 StateFlow。这样,外部代码只能读取状态,而无法修改它。通过这种方式,我们可以确保状态的不可变性并防止外部代码直接更改状态。

val strList: StateFlow<List<String>> = _strList.asStateFlow()

这样,外部代码只能使用 strList.collect { ... } 来收集状态的变化,而不能修改 strList 的值。这使得状态管理更加安全和可控。

4. 总结

  • MutableStateFlow 提供了修改状态的能力,而 StateFlow 只允许读取状态。
  • 使用 asStateFlow() 可以将 MutableStateFlow 转换为不可变的 StateFlow,从而保护状态不被外部代码直接修改。
  • 通过这种方式,我们可以确保状态的不可变性,减少副作用,使代码更加健壮和可维护。

5.延伸问题:为什么要使用 asSharedFlow

类似于 StateFlowSharedFlow 也有可变和不可变的版本。MutableSharedFlow 允许外部代码通过 emit() 向流中发送事件,而 SharedFlow 则是一个只读流,只能被外部代码订阅和收集,不能直接修改流中的内容。

为了确保流的不可变性,应该使用 asSharedFlow() 方法将 MutableSharedFlow 转换为不可变的 SharedFlow。这样,外部代码只能订阅事件流,而不能通过 emit() 向流中发送事件,避免了意外修改流内容的副作用。

http://www.dtcms.com/a/606308.html

相关文章:

  • ICMP timestamp请求响应漏洞 处理
  • 绍兴市建设局网站信金在线制作网站
  • 深入解析 ZooKeeper 3.5.7 配置文件 zoo.cfg —— 每个参数的用途与场景详解
  • LeetcodeHot100|76.最小覆盖子串
  • GPIO中断实现流程
  • 佛山市骏域网站建设专家微信公众号登录平台入口官网
  • 38nginx四层负载均衡配置,和动静分离解析
  • 深入理解C语言内存管理:从栈、堆到内存泄露与悬空指针
  • 如何免费做网站网页宁波模板建站哪家好
  • 最传统的网站推广手段公司网络优化方案
  • 广州市规划建设局网站佛山制作网站企业
  • mysql索引——理解索引机制及操作
  • 门户网站如何做seowordpress资源网模板
  • MySQL事务隔离级别:从并发困境到架构革新
  • 开发手机网站教程网页布局类型有哪些
  • 万峰科技.jsp网站开发四酷全书[m]seo收费还是免费
  • Linux:基础开发工具(二)
  • 小白教程:在 Windows 中启用 WSL 并安装 Linux 发行版
  • Linux RTC 驱动子系统详细实现方案
  • 主流服务器免费 SSL 证书部署手册 + 混合内容排查指南
  • Linux SNMP 团体号配置指定IP地址访问
  • 酒店移动网站建设方案wordpress添加导航栏
  • 大模型知识蒸馏实战:从Qwen-72B到Qwen-7B的压缩艺术
  • CMake Error at fc_base/gflags-src/CMakeLists.txt:73
  • 做一个网站需要多少人发布网站建设需求的经验
  • 网站开发多少工资做网站编辑好还是美工好
  • 上海网站建设公司四叶互联邗江区建设局网站
  • pytorch-张量转换
  • 推广型网站建设机构甘肃业聚质网络科技有限公司
  • 怎么让同一个局域网上的计算机看到我做的网站以公司名称为后缀的邮箱