stateflow一些数据依赖关系的使用

https://www.youtube.com/watch?v=NW03ZAQcTuY

某些数据来自其他数据,可以用flow进行一些变形转换

比较简单一点的例子

private val _users = MutableStateFlow(emptyList<User>())val users = _users.asStateFlow()//    private val _loacalUser= MutableStateFlow<User?>(null)
//    val localUser = _loacalUser.asStateFlow()val localUser = users.map {users->users.find {it.id =="local"}}.stateIn(viewModelScope, SharingStarted.WhileSubscribed(),null)private fun onUserJoined(user:User){_users.update { it+user }
//        if(user.id=="local"){
//            _loacalUser.update { user }
//        }}private fun onUserInfoUpdate(user: User){_users.update {it.map {curUser->if(curUser.id == user.id) user else curUser //id一样,替换掉,否则还是原来的}}
//        if(user.id=="local"){
//            _loacalUser.update { user }
//        }}

上面,本地用户其实是用户列表中的一个特殊用户,他的ID是local。

如果我们分开存储,像刚开始被注释掉的那些代码,用一个单独的localuser来存储本地用户,当用户列表变化的时候,需要监测是不是local,如果是local,要更新localuser,

当用户信息变化的时候,需要监测下,当前是不是localuser,如果是,则localuser又要更新一下

这样,当方法多了以后,非常麻烦,也容易忘记检查是否是local

于是就取消的localuser的当初存储,而是让他从user list 变化而来

把userlist map 变形,再找到是local的那个用户,然后在statein scope中,以便 引用。

稍微再复杂一点的还给出了一个聊天室的状态


class ChatViewModel : ViewModel() {private val _isLoggedIn = MutableStateFlow(false)private val _chatMessages = MutableStateFlow(emptyList<ChatMessage>())private val _users = MutableStateFlow<List<User>>(emptyList())val chatState = combine(_isLoggedIn,_chatMessages,_users){ isLoggedIn,chatMessages,users->if(isLoggedIn){ChatState(users.map { curUser->ChatPreview(curUser,chatMessages.filter { it.user.id==curUser.id }.maxByOrNull { it.time }?.message)})}else{null}}
}data class ChatState(val chatPreviews: List<ChatPreview>)data class ChatPreview(val user: User,val latestMessage: String?
)data class ChatMessage(val user: User,val message: String, val time: Long
)data class User(val id: String,val name: String,val email: String,val phone: String
)

针对每个个用户的聊天预览列表有多个因素影响,是否登录,用户列表,消息列表

然后根据这三个的数据combine生成一个chatstate的数据

其中 chatpreview中的最新消息,是把所有消息,根据当前用户的过滤后,再找出最近的时间的那条,再取message

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/55669.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

MES 制造执行系统的国内外应用现状及国内应用案例

【大家好&#xff0c;我是唐Sun&#xff0c;唐Sun的唐&#xff0c;唐Sun的Sun。一站式数智工厂解决方案服务商】 在当今制造业数字化转型的浪潮中&#xff0c;制造执行系统&#xff08;MES&#xff09;发挥着至关重要的作用。国内外的企业在 MES 系统的应用方面呈现出不同的特…

【记录】PPT|PPT 箭头相交怎么跨过

众所周知&#xff0c;在PPT中实现“跨线”效果并非直接可行&#xff0c;这一功能仅存在于Visio中。然而&#xff0c;通过一些巧妙的方法&#xff0c;我们可以在PPT中模拟出类似的效果。怎么在PPT中画交叉但不重叠的线-百度经验中介绍了一种方法&#xff0c;而本文将介绍一种改进…

Stable Diffusion绘画 | 签名、字体、Logo设计

第1步&#xff0c;使用 PS&#xff08;小白推荐使用 可画&#xff09;准备一个 512*768 的签名、字体、Logo图片&#xff1a; 第2步&#xff0c;来到模型网站&#xff0c;搜索&#x1f50d;关键词“电商”&#xff0c;找到一款喜欢的 LoRA&#xff1a; 第3步&#xff0c;选择一…

《CTF 特训营》:网络安全竞赛的进阶指南

在网络安全领域日益受到重视的今天&#xff0c;CTF&#xff08;Capture The Flag&#xff09;竞赛作为一种检验和提升网络安全技能的方式&#xff0c;受到了越来越多爱好者的关注。而《CTF 特训营》这本书&#xff0c;无疑是一本帮助读者深入了解 CTF 竞赛的优秀读物。 一、书籍…

ansible学习之 Facts

Facts 是什么&#xff1a; 在Ansible中&#xff0c;Facts是关于目标主机的信息&#xff0c;这些信息由Ansible在执行任务之前收集。Facts是特定于主机的&#xff0c;它们提供了系统级的数据&#xff0c;例如操作系统类型、内核版本、IP地址、已安装的包列表等。这些信息可以用…

简单花20分钟学会top 命令手册 (linux上的任务管理器)

1. 介绍 top 是一个常用的 Linux 命令行工具&#xff0c;用于实时监视系统资源和进程的运行情况。用户可以通过 top 命令查看系统的 CPU 使用率、内存占用情况、进程列表等重要信息&#xff0c;帮助快速了解系统运行状态并进行性能监控。该工具可以认为相当于windows上的任务管…

【Jenkins】如何使用 telegram 的机器人进行 jenkins 任务告警

author: jwensh & gpt date: 2024.10.08 要使用 Telegram 机器人发送 Jenkins 任务告警&#xff0c;步骤可以分为以下几个部分&#xff1a;创建 Telegram 机器人、配置 Jenkins 插件或者使用自定义脚本&#xff0c;将 Jenkins 任务的状态通过 Telegram 机器人通知给你。具体…

【SQL】掌握SQL查询技巧:高效数据整合与查询优化

目录 1. SQL 的基本构成2. SQL 联接&#xff08;JOIN&#xff09;2.1 内联接&#xff08;INNER JOIN&#xff09;2.2 外联接&#xff08;OUTER JOIN&#xff09;2.2.1 左外联接&#xff08;LEFT JOIN&#xff09;2.2.2 右外联接&#xff08;RIGHT JOIN&#xff09;2.2.3 全外联…

网页前端开发之Javascript入门篇(8/9):数组

Javascript数组 什么是数组? 答&#xff1a;其概念跟 Python教程 的列表一样&#xff0c;只是叫法不同和语法上有所变化而已。 下面是数组的语法&#xff1a; var aaa "张三"; var bbb [aaa, "李四", "王五"]; // 成员值可以是来自变量&am…

《系统架构设计师教程(第2版)》第17章-通信系统架构设计理论与实践-07-通信网络构建案例分析

文章目录 1. 高可用网络构建分析1.1 网络接入层高可用性设计1.1.1 高可用接入层特征1.1.2 接入汇聚层的方式1&#xff09;倒U 形接法(组网模型一)2&#xff09;U 形接法(组网模型二)3&#xff09;矩形接法(组网模型三&#xff09;4&#xff09;三角形接法(组网模型四) 1.2 网络…

2024年下半年软考准考证什么时候打印?

2024年下半年软考准考证打印入口网址如下&#xff1a; https://bm.ruankao.org.cn/sign/welcome 广东的同学特别注意&#xff1a;准考证打印截止时间是11月8号&#xff0c;也就是考试前一天。一定要提前打印准考证&#xff0c;考试当天是无法打印的。 2024年下半年软考准考证…

pycharm连接linux服务器需要提前安装ssh服务

在 Debian 或 Ubuntu 系统上&#xff0c;使用 APT&#xff1a; bash复制代码 sudo apt-get install openssh-server 在基于 RPM 的系统如 CentOS 或 RHEL 上&#xff0c;使用 YUM 或 DNF&#xff1a; bash复制代码 sudo yum install openssh-server 或对于较新的 RHEL/Cent…

C# 自适应屏幕分辨率

一、新增AutoSizeFormClass.cs class AutoSizeFormClass{//(1).声明结构,只记录窗体和其控件的初始位置和大小。public struct controlRect{public int Left;public int Top;public int Width;public int Height;}//(2).声明 1个对象//注意这里不能使用控件列表记录 List nCtr…

2024四大剪辑软件推荐及下载地址介绍!

在这个数字时代&#xff0c;视频成为了我们记录生活、分享故事的重要手段。无论是专业摄影师还是业余爱好者&#xff0c;都需要一款好用的视频剪辑软件来将自己的创意变为现实。下面&#xff0c;我将为大家介绍几款各有特色的视频剪辑工具&#xff0c;同时也附上下载的地址&…

PAT甲级-1004 Counting Leaves

题目 题目大意 给定一棵树&#xff0c;每个节点从01到n编号&#xff0c;规定01为根节点&#xff0c;求每层叶子节点的个数。 思路 用二维数组存储树。每层叶子节点的个数&#xff0c;只能用dfs深度遍历&#xff0c;用一个数组存储所有层数的叶子节点个数。相同层数并且是叶子…

面向对象技术——设计模式

目录 层次结构 具体设计模式分类 创建型模式&#xff08;处理创建对象&#xff09; 结构型模式&#xff08;处理类和对象的组合&#xff09; 行为型模式&#xff08;描述类或者对象的交互行为&#xff09; 创建型设计模式 ​编辑 结构型设计模式 行为型设计模式​编辑 …

音视频入门基础:FLV专题(13)——FFmpeg源码中,解析任意Type值的SCRIPTDATAVALUE类型的实现

一、SCRIPTDATAVALUE类型 从《音视频入门基础&#xff1a;FLV专题&#xff08;9&#xff09;——Script Tag简介》中可以知道&#xff0c;根据《video_file_format_spec_v10_1.pdf》第80到81页&#xff0c;SCRIPTDATAVALUE类型由一个8位&#xff08;1字节&#xff09;的Type和…

wsl中配置cuda,pytorch,cudnn,vscode

参考链接 查看python版本 从 NVIDIA 的官网上下载 CUDA 的 pin 文件。这个文件确保 CUDA 仓库的优先级更高&#xff0c;防止与其他仓库发生冲突。 wget https://developer.download.nvidia.com/compute/cuda/repos/wsl-ubuntu/x86_64/cuda-wsl-ubuntu.pin将下载的 cuda-wsl-u…

Java并发编程:深入探索与实战案例

Java并发编程&#xff1a;深入探索与实战案例 在当今的多核处理器时代&#xff0c;并发编程已成为提升应用程序性能、优化资源利用的关键技术之一。Java&#xff0c;作为一门广泛应用的编程语言&#xff0c;凭借其强大的并发处理能力&#xff0c;在众多编程语言中脱颖而出。本…

【C++打怪之路Lv7】-- 模板初阶

&#x1f308; 个人主页&#xff1a;白子寰 &#x1f525; 分类专栏&#xff1a;C打怪之路&#xff0c;python从入门到精通&#xff0c;数据结构&#xff0c;C语言&#xff0c;C语言题集&#x1f448; 希望得到您的订阅和支持~ &#x1f4a1; 坚持创作博文(平均质量分82)&#…