谈谈Android Jetpack Compose中的状态提升

news2024/11/23 1:50:09

谈谈Android Jetpack Compose中的状态提升

在本文中,我们将了解Jetpack Compose中的状态提升(State Hoisting)。在深入研究这个主题之前,让我们先了解一下Jetpack Compose中的有状态(Stateful)和无状态(Stateless)组合。

有状态 vs 无状态(Stateful Vs Stateless)

使用remember保存对象的组合会创建内部状态,使其成为有状态(Stateful)组合。

无状态组合是指不保存任何状态的组合。通过使用状态提升(State Hoisting)可以轻松实现无状态。

https://developer.android.com/jetpack/compose/state#state-hoisting

状态提升指的是,每当你创建任何子组合函数并且它被多次重用时,将它们变为无状态(Stateless)。在子组合函数中不应该包含任何remember{mutableState()},而在父组合中调用此子组合函数时,将其设为有状态(Stateful)。这样做可以方便地复用子组合函数。

父组合函数 - 有状态(Stateful
子组合函数 - 无状态(Stateless

无状态提升

@OptIn(ExperimentalMaterial3Api::class)
@Composable
fun WithoutStateHoisting() {

    var text by remember { mutableStateOf("") }

    TextField(value = text, onValueChange = { text = it })

}

如上例所示,我们创建了一个组合函数,其中包含一个TextField并且在其中保存了一个状态。

这个例子没有问题,但是假设我们想要重用这个WithoutStateHoisting()组合函数,那么我们很难做到这一点。

如果我想创建一个带有用户名和电子邮件字段的登录页面,我们可以在父组合中调用此组合函数两次,但问题是如何管理状态,因为我们在子组合函数中定义了状态,那么我怎么能够管理或识别出两个状态(邮箱和用户名)呢?

为了解决这个问题,我们需要依赖状态提升。

使用状态提升

@OptIn(ExperimentalMaterial3Api::class)
@Composable
fun WithStateHoistingExample(
    title: String,
    value: String,
    onValueChange: (String) -> Unit
) {

    TextField(value = value, onValueChange = onValueChange, placeholder = { Text(text = title) })
}

现在你可以看到,在上面的代码中,我们从这里移除了状态,而是使用了onValueChange: (String) -> Unit来将值更新/发送到父组合函数。

value:无论数据来自父组合还是子组合,都会在TextField中更新。

而且好消息是,这个组合函数是可重用的。

@Composable
fun StateHoisting(
    modifier: Modifier
) {

    var username by remember { mutableStateOf("") }
    var email by remember { mutableStateOf("") }

    Column(
        modifier = modifier
            .padding(20.dp)
            .fillMaxSize(),
        horizontalAlignment = Alignment.CenterHorizontally
    ) {

        WithStateHoistingExample(
            title = stringResource(R.string.username),
            value = username,
            onValueChange = { username = it })

        Spacer(modifier = Modifier.height(20.dp))

        WithStateHoistingExample(
            title = stringResource(R.string.email),
            value = email,
            onValueChange = { email = it })

    }

}

你可以看到我们在上面创建了两个状态,用户名和电子邮件,并将这些状态传递到子组合函数WithStateHoistingExample()中。

结论

状态提升是在Jetpack Compose中推荐使用的一种方式。请注意,如果你的子组合函数被多次重用,请不要使其有状态函数( stateful),始终使用状态提升以便可以重用并使它们感觉独立。

Github

https://github.com/nameisjayant/compose-blogs-repository/tree/main/app/src/main/java/com/nameisjayant/articlesrepository/ui/stateHositing?source=post_page

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

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

相关文章

如何快速查询众多未签收快递单号

在日常工作中,快递查询是一个常见的任务。无论是电商卖家、快递员还是收件人,都需要查询快递的状态和信息。然而,一个一个地查询快递单号不仅耗时,还容易出错。因此,使用固乔快递查询助手这样的工具可以大大提高查询效…

Polygon zkEVM递归证明技术文档(5)——附录:借助SNARKjs和PIL-STARK实现proof composition

前序博客有: Polygon zkEVM递归证明技术文档(1)【主要描述了相关工具 和 证明的组合、递归以及聚合】Polygon zkEVM递归证明技术文档(2)—— Polygon zkEVM架构设计Polygon zkEVM递归证明技术文档(3&#…

【数据结构】计数排序 排序系列所有源代码 复杂度分析(终章)

目录 一,计数排序 1,基本思想 2,思路实现 3,计数排序的特性总结: 二,排序算法复杂度及稳定性分析 三,排序系列所有源代码 Sort.h Sort.c Stack.h Stack.c 一,计数排序 计数…

origin作图上下对开,修改颜色

一般上下对开后默认两幅图颜色相同,如果要修改成不同的颜。双击空白处,在图层栏里取消勾选绘图属性。

基于Java的在线文档编辑管理系统设计与实现(源码+lw+部署文档+讲解等)

文章目录 前言具体实现截图论文参考详细视频演示为什么选择我自己的网站自己的小程序(小蔡coding)有保障的售后福利 代码参考源码获取 前言 💗博主介绍:✌全网粉丝10W,CSDN特邀作者、博客专家、CSDN新星计划导师、全栈领域优质创作…

BRISK: Binary Robust Invariant Scalable Keypoints全文翻译

pdf链接:https://pan.baidu.com/s/1gFAYMPJStl4cF0CswY9cMQ 提取码:yyds 摘要 从图像中有效和高效地生成关键点是文献中深入研究的问题,并形成了许多计算机视觉应用的基础。该领域的领导者是SIFT和SURF算法,它们在各种图像转换下…

图文结合丨Prometheus+Grafana+GreatSQL性能监控系统搭建指南(上)

一、环境介绍 本文环境,以及本文所采用数据库为GreatSQL 8.0.32-24 $ cat /etc/system-release Red Hat Enterprise Linux Server release 7.9 (Maipo) $ uname -a Linux gip 3.10.0-1160.el7.x86_64 #1 SMP Tue Aug 18 14:50:17 EDT 2020 x86_64 x86_64 x86_64 G…

Xcode 15下,包含个推的项目运行时崩溃的处理办法

升级到Xcode15后,部分包含个推的项目在iOS17以下的系统版本运行时,会出现崩溃,由于崩溃在个推Framework内部,无法定位到具体代码,经过和个推官方沟通,确认问题是项目支持的最低版本问题。 需要将项目的最低…

关于 打开虚拟机出现“...由VMware产品创建,但该产品与此版VMwareWorkstateion不兼容,因此无法使用” 的解决方法

文为原创文章,转载请注明原文出处 本文章博客地址:https://hpzwl.blog.csdn.net/article/details/133678951 红胖子(红模仿)的博文大全:开发技术集合(包含Qt实用技术、树莓派、三维、OpenCV、OpenGL、ffmpeg、OSG、单片机、软硬结…

我的创业之路:我为什么选择 Angular 作为前端的开发框架?

我是一名后端开发人员,在上班时我的主要精力集中在搜索和推荐系统的开发和设计工作上,我比较熟悉的语言包括java、golang和python。对于前端技术中typescript、dom、webpack等流行的框架和工具也懂一些。目前,已成为一名自由职业者&#xff0…

通用监控视频web播放方案

业务场景 对接监控视频,实现海康大华等监控摄像头的实时画面在web端播放 方案一,使用 RTSP2webnode.jsffmpeg 说明:需要node环境,原理就是RTSP2web实时调用ffmpeg解码。使用单独html页面部署到服务器后,在项目中需要播…

【stm32芯片设置解惑】:stm32F103系列的开漏输出和推挽输出的区别

场景: 大家在开发stm32的时候,不管是标准库开发还是hal库开发,最基础的就是芯片引脚的某某设置,为什么这么设置?这样设置的好处是什么? 问题描述 — 开漏输出和推挽输出的用处和区别 什么是开漏输出&#x…

Android Studio修改模拟器AVD Manger目录

Android Studio修改虚拟机AVD Manger目录 1、在AS的设备管理器Device Manager中删除原来创建的所有虚拟机(Android Virtual Device); 2、新建一个自定义的AVD目录,例如:D:\Android\AndroidAVD 3、在高级系统设置中增加…

ArcGIS中的镶嵌数据集与接缝线

此处介绍一种简单方法,根据生成的轮廓线来做镶嵌数据集的拼接。 一、注意修改相邻影像的上下重叠。注意修改ZOrder和每幅影像的范围。 二、修改新的镶嵌线并且导出影像文件。 三、还有其他方法和注意事项。

c++视觉--通道分离,合并处理,在分离的通道中的ROI感兴趣区域里添加logo图片

c视觉–通道分离&#xff0c;合并处理 通道分离: split()函数 #include <opencv2/opencv.hpp>int main() {// 读取图像cv::Mat image cv::imread("1.jpg");// 检查图像是否成功加载if (image.empty()) {std::cerr << "Error: Could not read the…

MyBatis-Plus演绎:数据权限控制,优雅至极!

&#x1f389;&#x1f389;欢迎来到我的CSDN主页&#xff01;&#x1f389;&#x1f389; &#x1f3c5;我是尘缘&#xff0c;一个在CSDN分享笔记的博主。&#x1f4da;&#x1f4da; &#x1f449;点击这里&#xff0c;就可以查看我的主页啦&#xff01;&#x1f447;&#x…

MFC扩展库BCGControlBar Pro v33.6 - 网格、报表控件功能升级

BCGControlBar库拥有500多个经过全面设计、测试和充分记录的MFC扩展类。 我们的组件可以轻松地集成到您的应用程序中&#xff0c;并为您节省数百个开发和调试时间。 BCGControlBar专业版 v33.6已正式发布了&#xff0c;此版本包含了对图表组件的改进、带隐藏标签的单类功能区栏…

Tomcat 9.0.41在IDEA中乱码问题(IntelliJ IDEA 2022.1.3版本)

1. 乱码的产生是由于编码和解码的编码表不一致引起的。 2. 排查乱码原因 2.1 在idea中启动Tomcat时控制台乱码排查 Tomcat输出日志乱码: 首先查看IDEA控制台&#xff0c;检查发现默认编码是GBK。 再查看Tomcat日志&#xff08;conf文件下logging.properties&#xff09;的默…

GaussDB数据库SQL系列-动态语句

目录 一、前言 二、构建动态SQL语句的基本步骤和注意事项 1、基本步骤 2、主要事项 三、GaussDB中执行动态查询语句&#xff08;示例&#xff09; 1、方式一&#xff1a;EXECUTE IMMEDIATE 2、方式二&#xff1a;OPEN FOR 四、GaussDB中的动态非查询语句&#xff08;示…

MathType2024苹果版数学公式编辑器

MathType苹果2024版是一款备受好评的数学公式编辑器&#xff0c;很多网友在编辑文本时对各种数学符号非常挠头&#xff0c;因为都不太好找&#xff0c;而这款软件能够在各种文档中加入复杂的数学公式和符号&#xff0c;并且与常见的文字处理软件和演示程序配合使用&#xff0c;…