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

Compose中的rememberUpdatedState

作为一个初学者,在这个方法上着实费劲了一番。

先说它的使用场景:在不让效应(LaunchedEffect)或协程重启的情况下,仍然能使用到最新值。

看如下场景:

@Composable fun Mytest(method:()->Unit){ val to by remember { mutableStateOf(method) } Log.i(TAG,"MyTest重组 ${to.hashCode()} ${method.hashCode()}") LaunchedEffect(Unit) { while (true){ delay(1000) to() } } } @Composable fun Test(){ Column(modifier = Modifier.fillMaxSize().padding(vertical = 80.dp, horizontal = 24.dp)) { var methods: () -> Unit by remember { mutableStateOf( { Log.i(TAG, "打印500") } ) } Column(modifier = Modifier.fillMaxWidth().height(200.dp)) { Mytest(methods) } Button(onClick = { methods = {Log.i(TAG,"打印1000")}}) { Text("1000") } Button(onClick = {methods = {Log.i(TAG,"打印2000")}}) { Text("2000") } Button(onClick = {methods = {Log.i(TAG,"打印3000")}}) { Text("3000") } Button(onClick = {methods = {Log.i(TAG,"打印4000")}}) { Text("4000") } } }

即页面上有4个按钮,每个按钮点击后都会给方法变量 methods 重新赋值。同时,还用LaunchedEffect启动了一条协程,每隔1秒就执行一次methods。运行上述代码可知,程序启动后执行如下

符合大家预期吧:程序启动,Mytest()执行一次,每隔1秒执行以下初始方法(即打印500)。

点击一个按钮,如按钮3000,执行如下

不知这个是否符合大家预期:给methods赋予新值之后,Mytest()执行了重组,传进来的方法是一个新方法,但是to还是原来的方法。这一点想想其实也很容易理解,因为使用了 val to by remember { mutableStateOf(method) } 其中remember就是为了保障Mytest()重组时不会对to重新赋值,所以to仍旧是原来的值,不会因为重组而改变。

那么问题来了:我想要的结果是重组后执行新的方法。那么该怎么办?

改为 val to by rememberUpdatedState(method) 即可.如下:

@Composable fun Mytest(method:()->Unit){ val to by rememberUpdatedState(method) Log.i(TAG,"MyTest重组 ${to.hashCode()} ${method.hashCode()}") LaunchedEffect(Unit) { while (true){ delay(1000) to() } } }

rememberUpdatedState可让to变为最新值,同时 LaunchedEffect 也不会重启。

不让协程(效应)重启,但协程里却仍能使用到最新值。

http://www.jsqmd.com/news/478700/

相关文章:

  • FakeSMTP-2.1.1使用
  • 【危险】云提供商一行命令就能偷看你的openclaw所用的llm api key
  • 基于Simulink的电动车PMSM能量泄放与回收系统仿真设计
  • 手写Tomcat流程笔记
  • 筹备2026体育专栏壁纸,五类素材站点的筛选逻辑与避险指南
  • AI智慧社区--实现登录认证:验证码、JWT Token与接口校验
  • 【SQL】多表关系与冷热数据(全维度知识体系)
  • 10个大数据规范性分析案例:行业最佳实践分享
  • 基于C-NCAP中CCRs工况下的前碰撞预警及纵向避撞控制策略研究
  • React Native 热更新深度解析
  • 大模型最后一步关键训练:偏好调优,让AI更懂人心
  • CTFshow————web13————WP
  • Oracle存储过程怎么写
  • Flutter 三方库 kubernetes 的鸿蒙化适配指南 - 掌上 K8s 集群管理、实时监控容器云、打造鸿蒙端 DevOps 运维旗舰应用
  • 【TypeReference<目标泛型类型>】
  • Web前端开发技术作业随笔
  • openclaw系列1:安装
  • 开发一个简单的脚手架
  • TestPilot - 智能测试用例生成工具
  • 什么是DAS分布式光纤声波传感系统?原理与应用解析
  • 大数据领域Doris在医疗科技领域的临床数据分析
  • Flutter 三方库 hotp 的鸿蒙适配指南 - 实现 RFC 4226 标准双因素认证、在 OpenHarmony 上打造极致安全的动态令牌实战
  • 汽油生产
  • 必看!AI拓客软件源头厂家哪家强?
  • Java大厂面试实录:谢飞机的搞笑面试之旅
  • Python当中ascii码与字母的相互转换
  • 深度学习之循环神经网络RNN
  • VMware安装RedHat Linux9全攻略
  • LeeCode4.寻找两个正序数组的中位数。小白都能懂。
  • JAVA基础二