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

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.mrgr.cn/news/45971.html

相关文章:

  • Ubuntu下v4l2采集摄像头视频
  • 项目开发--大模型--个人问答知识库--chain控制
  • en造数据结构与算法C# 之 动态规划
  • Nodejs连接Mysql笔记
  • springboot 整合 rabbitMQ(1)
  • 滚雪球学Redis[4.1讲]:Redis的高可用性与集群架构
  • 适合技术小白入门 AI 编程的六个场景
  • Deep tone mapping network in HSV color space
  • C# HttpClient请求URL重定向后丢失Authorization认证头信息 .Net Core Web Api
  • 后端指的是什么
  • Llama3 AI应用开发实战指南
  • 岸汇率和离岸汇率
  • [LeetCode] 315. 计算右侧小于当前元素的个数
  • GPT系列模型从GPT-1到InstructGPT的技术演进与未来展望
  • Java类之间的关系
  • springboot-网站开发-linux服务器部署jar格式图片存档路径问题
  • uniapp控制点击view事件,不包含子view区域
  • MATLAB中linsolve函数用法
  • 使用 YOLOv 11 模型实现实时手语检测 可同时识别多个手语手势
  • 如何开发APP?