Compose中的重组、state、remember

2024-02-02 17:44
文章标签 compose state 重组 remember

本文主要是介绍Compose中的重组、state、remember,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

文章目录

  • 一、前言
  • 二、示例代码
  • 三、参考链接:

一、前言

在Compose中UI采用State状态来控制UI变化,根据状态的不同来显示不同的内容,每次UI的重新变化成为重组。通过remember可以将state的数据保存起来(或者实例对象,毕竟条件不改变的话默认只会执行一次remember中的函数,哪怕重组无数次),避免在重组期间进行重置。下面记录下三者的关联。
其中个人感觉state和remember不是必须的,如果能主动触发组件重组获取新数据,那么完全可以不使用state去存储数据。如果把变量存储在一个公共空间,在组件重组期间不会重新生成实例对象,那么也可以不使用remember来进行保存对象(虽然事实上remember最终也是定义了一个kotlin文件级别的变量来进行存储数据)。虽然如此,但是能用state和remember的话还是使用的好,因为实际开发中UI页面很复杂,自己精细去控制某一个组件的重组的话会很麻烦。

二、示例代码

如下是一个简单的Compose代码,用来显示文本

@Composable
fun TestWidget(){Column {Text(text = "这是一个文本")}
}

然后增加一个按钮来改变文本

var count = 0
@Composable
fun TestWidget(){Column {Button(onClick = { count += 1 }) {Text(text = "点我")}Text(text = "这是一个文本:${count}")}
}

运行后会发现点击按钮没有效果,这是因为在Compose中没有对数据进行直接观察,是通过State来承载数据然后,监听State的变化来变化UI的。如果想要改变需要修改为以下代码

private val count = mutableIntStateOf(0)
@Composable
fun TestWidget(){Column {Button(onClick = { count.intValue += 1 }) {Text(text = "点我")}Text(text = "这是一个文本:${count.intValue}")}
}

将变量count定义在函数内部然后重新运行会发现数据UI还是没有变化

@Composable
fun TestWidget(){val count = mutableIntStateOf(0)Log.e("YM--->","--->Test重组")Column {Button(onClick = { count.intValue += 1 }) {Text(text = "点我")}Text(text = "这是一个文本:${count.intValue}")}
}

这里通过日志可以发现每次点击按钮,函数都会重新执行,这样就导致了count每次都会重新初始化变量,所以需要用一个方式将内容进行保存,比如官方提供的remember或者其余方式

@Composable
fun TestWidget(){val count = remember {Log.e("YM--->","--->remember")mutableIntStateOf(0)   }Log.e("YM--->","--->Test重组")Column {Button(onClick = { count.intValue += 1 }) {Text(text = "点我")}Text(text = "这是一个文本:${count.intValue}")}
}

执行代码会发现remember{}函数中代码仅仅执行了一次,这样就保证了State的变量为同一个实例(将State放在别的地方只要能保证同一个变量也是可以的)。如果想根据情况去刷新这个实例对象可以根据情况设置key值

 val count = remember(key1 = "A") {Log.e("YM--->","--->remember")mutableIntStateOf(0)}

注意: State的变量如果在Compose重组范围内定义,最好用remember去存储,因为这样的话可以避免不知道哪里的重组就导致了数据的重新初始化。

三、参考链接:

  1. 了解 Compose 的重组作用域
  2. Compose 编程思想
  3. 构建 Compose 界面
  4. 状态和 Jetpack Compose
  5. Jetpack Compose 中的高级状态和附带效应

这篇关于Compose中的重组、state、remember的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/671487

相关文章

从状态管理到性能优化:全面解析 Android Compose

文章目录 引言一、Android Compose基本概念1.1 什么是Android Compose?1.2 Compose的优势1.3 如何在项目中使用Compose 二、Compose中的状态管理2.1 状态管理的重要性2.2 Compose中的状态和数据流2.3 使用State和MutableState处理状态2.4 通过ViewModel进行状态管理 三、Compose中的列表和滚动

状态模式state

学习笔记,原文链接 https://refactoringguru.cn/design-patterns/state 在一个对象的内部状态变化时改变其行为, 使其看上去就像改变了自身所属的类一样。 在状态模式中,player.getState()获取的是player的当前状态,通常是一个实现了状态接口的对象。 onPlay()是状态模式中定义的一个方法,不同状态下(例如“正在播放”、“暂停

为什么现在很多人愿意选择做债务重组?债重组真的就这么好吗?

债务重组,起初作为面向优质企业客户的定制化大额融资策略,以其高效周期著称,一个月便显成效。然而,随着时代的车轮滚滚向前,它已悄然转变为负债累累、深陷网贷泥潭者的救赎之道。在此路径下,个人可先借助专业机构暂代月供,经一段时间养护征信之后,转向银行获取低成本贷款,用以替换高昂网贷,实现利息减负与成本优化的双重目标。 尽管债务重组的代价不菲,远超传统贷款成本,但其吸引力依旧强劲,背后逻辑深刻。其一

docker-compose安装和简单使用

本文介绍docker-compose的安装和使用 新版docker已经默认安装了docker-compose 可以使用docker-compose -v 查看docker-compose版本 如果没有的话可以使用以下命令直接安装 sudo curl -L https://github.com/docker/compose/releases/download/1.16.1/docker-c

Docker Compose使用手册

Docker Compose是一个比较简单的docker容器的编配工具,以前的名称叫Fig,由Orchard团队开发的开源Docker编配工具,在2014年被Docker公司收购,Docker Compose是使用Python语言开发的一款docker编配工具。使用Docker Compose,可以用一个yml文件定义一组要启动的容器,以及容器运行时的属性。Docker Compose称这些容器为

【docker】基于docker-compose 安装elasticsearch + kibana + ik分词器(8.10.4版本)

记录下,使用 docker-compose 安装 Elasticsearch 和 Kibana,并配置 IK 分词器,你可以按照以下步骤进行。此过程适用于 Elasticsearch 和 Kibana 8.10.4 版本。 安装 首先,在你的工作目录下创建一个 docker-compose.yml 文件,用于配置 Elasticsearch 和 Kibana 的服务。 version:

Docker-Compose for Linux安装

Docker-Compose for Linux安装 1.前言2.安装Docker-Compose 1.前言 我们为什么要使用docker-compose? 我们运行一个docker镜像,需要添加大量的参数。 现在我们可以通过docker-compose编写这些参数。 Docker-Compose可以帮助我们批量管理这些容器。 我们只需要通过一个docker-compos

docker和docker-compose安装脚本

1.docker安装脚本 1.1创建脚本文件 touch install_docker.shchmod 777 install_docker.shcat > install_docker.sh << 'EOF'#!/bin/bash# 删除现有的 Dockerecho -e "========== 1. 删除现有 Docker ================\n\n"sudo yu

Apache-Flink深度解析-State

来源:https://dwz.cn/xrMCqbk5 Flink系列精华文章合集入门篇: Flink入门Flink DataSet&DataSteam APIFlink集群部署Flink重启策略Flink分布式缓存Flink重启策略Flink中的TimeFlink中的窗口Flink的时间戳和水印Flink广播变量Flink-Kafka-connetorFlink-Table&SQLFlink

Flink使用Broadcast State实现流处理配置实时更新

大数据技术与架构 点击右侧关注,大数据开发领域最强公众号! 暴走大数据 点击右侧关注,暴走大数据! 本文作者时延军发表在http://shiyanjun.cn,如果你也在使用Broadcast State,那么可以参考一下。 Broadcast State是Flink支持的一种Operator State。使用Broadcast State,可以在Flink程序的一个Stream中输入数