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

Jetpack Compose - MutableStateFlow、LaunchedEffect 函数

MutableStateFlow

1、基本介绍
  1. MutableStateFlow 是 Kotlin 协程库中专门用于状态管理的热流

  2. MutableStateFlow 可以看作 MutableLiveData 的协程版本,它们的设计目标一致,持有可观察的可变数据

  3. StateFlow 是只读的,MutableStateFlow 是可读可写的

2、演示
classMyViewModel{// 私有可写,对外可读privateval_counter=MutableStateFlow(0)valcounter:StateFlow<Int>=_counter.asStateFlow()privateval_message=MutableStateFlow("")valmessage:StateFlow<String>=_message.asStateFlow()funincrement(){_counter.value=_counter.value+1_message.value="点击了${_counter.value}次"}funreset(){_counter.value=0_message.value=""}}
  1. 使用 collectAsState 函数
// 记住状态,不然它每次都会重新创建valmyViewModel=remember{MyViewModel()}// 订阅数据,数据更新时,自动刷新 UIvalcounterbymyViewModel.counter.collectAsState()valmessagebymyViewModel.message.collectAsState()Column(modifier=Modifier.fillMaxSize().padding(16.dp),verticalArrangement=Arrangement.Center){Text(text="计数:$counter",fontSize=24.sp)Spacer(modifier=Modifier.height(8.dp))Text(text=message,fontSize=16.sp)Spacer(modifier=Modifier.height(16.dp))Button(onClick={myViewModel.increment()}){Text("增加")}Spacer(modifier=Modifier.height(8.dp))Button(onClick={myViewModel.reset()}){Text("重置")}}
  1. 使用 collect 函数
// 记住状态,不然它每次都会重新创建valmyViewModel=remember{MyViewModel()}varcounterbyremember{mutableStateOf(0)}varmessagebyremember{mutableStateOf("")}LaunchedEffect(Unit){myViewModel.counter.collect{newValue->counter=newValue}}LaunchedEffect(Unit){myViewModel.message.collect{newValue->message=newValue}}Column(modifier=Modifier.fillMaxSize().padding(16.dp),verticalArrangement=Arrangement.Center){Text(text="计数:$counter",fontSize=24.sp)Spacer(modifier=Modifier.height(8.dp))Text(text=message,fontSize=16.sp)Spacer(modifier=Modifier.height(16.dp))Button(onClick={myViewModel.increment()}){Text("增加")}Spacer(modifier=Modifier.height(8.dp))Button(onClick={myViewModel.reset()}){Text("重置")}}

LaunchedEffect 函数

1、基本介绍
  • 在 Compose 中,LaunchedEffect 函数专门用来安全执行挂起函数,生命周期自动绑定到可组合项
场景说明
进入组合启动协程,执行代码块
退出组合自动取消协程
键值变化时重组先取消旧协程,再启动新协程
  • 键值选择如下
键值行为
Unit只执行一次,不重启
key (变量)变量变化时重启
2、演示
@ComposablefunMainPage(){varmessagebyremember{mutableStateOf("首页加载中")}LaunchedEffect(Unit){delay(2000)message="首页加载完成"}Text(message,fontSize=24.sp)}
  1. 首页加载,只执行一次

  2. 在这个例子中,LaunchedEffect 绑定到了 MainPage 这个可组合函数

@ComposablefunMainPage(){varkeywordbyremember{mutableStateOf("")}varsearchResultsbyremember{mutableStateOf(listOf<String>())}LaunchedEffect(keyword){delay(2*1000)if(keyword.isNotBlank()){searchResults=keyword.map{it.toString()}}else{searchResults=emptyList()}}Column{TextField(value=keyword,onValueChange={keyword=it})searchResults.forEach{Text(it)}}}
  1. 搜索防抖,用户每次输入,keyword 变化触发 LaunchedEffect

  2. 每次都会等待 2 秒

  3. 如果在 2 秒内 keyword 再次变化,会取消之前的协程,重新开始计时

  4. 只有稳定 2 秒没有新输入,才会执行更新 searchResults

@ComposablefunMainPage(){valalpha=remember{Animatable(1f)}LaunchedEffect(Unit){while(isActive){delay(1000)alpha.animateTo(0f,tween(300))// 将 alpha 值从 1f 动画到 0f,时长 300msalpha.animateTo(1f,tween(300))// 将 alpha 值从 0f 动画到 1f,时长 300ms}}Box(modifier=Modifier.size(100.dp).background(Color.Red.copy(alpha=alpha.value)))}
  • 呼吸灯效果,循环重复,isActive 检查协程是否还在运行
http://www.jsqmd.com/news/1328678/

相关文章:

  • 认知三论 · 认知总作用量方程深入研究报告
  • 语义分割实战——基于U_Net,PSPNet,DeepLab神经网络杂草分割系统2:含训练测试代码和数据集
  • 运算符基础知识打地基
  • 3分钟掌握PalEdit:幻兽编辑神器让你的PalWorld体验翻倍
  • 长春芬尼门店哪家专业:【芬尼】证照齐全 - 17728098551
  • 吞吐量最优化设计
  • 基于keras框架的MobileNetV2深度学习神经网络蔬菜分类识别系统源码
  • Smithbox入门指南:零基础掌握魂系列游戏修改神器
  • 如何轻松获取Sketchfab 3D模型资源:Firefox用户脚本实用指南
  • Xmind思维导图使用教程:从基础操作到高阶功能全解析
  • HarmonyOS应用实战-启示散页-76-清空数据别只删 Preferences:同步 AppStorage、缓存和恢复账本
  • 长春空气能采暖选购网点哪家专业:【芬尼】合规经营 - 18002239949
  • JazzIt常见问题解决:依赖安装、音乐播放失败等问题排查
  • 【AI法律文书写作实战指南】:20年律所技术总监亲授,3类高风险文书自动生成避坑清单
  • 终极指南:用yuzu模拟器在PC上畅玩Switch游戏
  • Supabase Kubernetes迁移指南:使用Migration资源管理数据库变更
  • 公司注销后小程序怎么办?2026年代办机构推荐与线上办理流程 - 跑政通
  • 为什么你学网安半年还是“只会复现”?解锁从复刻小白到独立挖洞的完整蜕变路线
  • 基于keras框架的LSTM深度学习神经网络手写字识别系统源码
  • Unity单例模式深度解析:从实现到架构的避坑指南
  • 大数据开发平台
  • 2026北京数字展厅设计公司哪家靠谱?数字展厅展馆选型指南
  • CSDN排名记录
  • arcconf的介绍,安装和使用方法
  • leetcode刷题(2):链表
  • Unity高效开发:构建可复用的脚本工具库架构与核心模块实现
  • 国产长芯微LPA620完全PIN-PIN替代AD620,参数对比分析
  • ansible安装部署及常用模块详解(超详细)
  • 09_大模型里的竞品分析怎么做_AnswerBit对比监控指南
  • 透明背景图制作全攻略:2026年手机电脑都会用到的实用方法 - 耶斯去水印