android | 声明式编程!(笔记)

https://www.jianshu.com/p/c133cb7cac21  讲的不错


命令式UI (how to do)

声明式UI (what to do) what to do

也许有人会说Data Binding不是可以让XML自己"动"起来吗?没有错,Data Binding其实就是Compose诞生之前的一种声明式U方案,谷歌曾经寄希望于通过它来提升U编码效率。

但是Compose推荐Composable使用首字母大写的名词来命名,且不允许有返回值。


组合优于继承


@Composable
fun HelloComposable() {
    var content by rememberSaveable { mutableStateOf("") }
    HelloContent(content = content, onContentChange = { content = it })
}

@OptIn(ExperimentalMaterial3Api::class)
@Composable
fun HelloContent(content: String, onContentChange: (String) -> Unit) {
    Column {
        Text(text = "Hello $content")
        OutlinedTextField(
            value = content,
            onValueChange = onContentChange,
            label = { Text(text = content) }
        )
    }
}

//================================
Jetpack Compose 遵循单向数据流原则(unidirectional data flow),这是一种用于管理状态和数据更新的设计模式,特别适合用于构建用户界面。在这种模式下,所有的数据更新都应当遵循单个方向的流动,这有几个重要的好处:
预测性和可理解性: 当数据和状态变化总是以相同的方式流动时,应用的行为变得更加可预测和易于理解。这使得开发者更容易追踪数据流,理解数据是如何、以及在何处被更新的。
简化状态管理: 在单向数据流中,数据和状态的更新通常集中在特定的地点进行管理,减少了在应用各处分散更新数据引起的混乱和错误。
容易调试: 由于数据流的一致性,当出现问题时更容易定位和修复错误,因为开发者可以清晰地了解数据从哪里来,以及应该在哪里进行修改。
在代码示例中,content是作为单一数据源存在的,其值由HelloComposable管理,且通过参数传递到HelloContent中。当在OutlinedTextField中进行输入时,通过onValueChange事件回调更新外部content的状态,从而触发重新渲染(或称为重组,recomposition)过程。由此,我们可以看到数据(content值)是从上层流向下层的,而事件(用户的输入事件)则是从下层流向上层的,导致状态更新并触发重组。
这种模式确保了组件的UI始终与其状态保持一致,同时也使得状态的更新逻辑变得更加集中和清晰。

//================================
单一数据源决定了Composable数据流的单向流动,数据(content)总是自上而下流动,而事件(onContentChange)总是自下而上传递 为什么呢?


事件(如onContentChange)在Jetpack Compose(或任何现代UI框架)中自下而上传递的概念,主要体现在事件处理和状态管理方面。以OutlinedTextField组件中的onValueChange事件为例,来解析这一点:
事件回调的定义:在OutlinedTextField组件中,使用onValueChange属性定义了一个事件回调。当用户在文本字段中输入文本时,这个回调函数被触发。
状态更新:onValueChange通常会被设定为一个更新上层状态的函数,即在您的例子中的onContentChange。这意味着当OutlinedTextField中的事件(例如文本更改)发生时,它会调用onContentChange,这一回调函数随后可能会更新应用的状态(如,更新一个由父组件维护的content变量)。
自下而上的数据流:OutlinedTextField(作为较“低”层的组件)通过事件(如用户输入)影响了上层状态(通过onContentChange更新content值)。尽管UI框架通常采用自上而下的数据流动(父组件到子组件的状态传递),事件处理却采用自下而上的方式传递,即从子组件回到父组件,并最终可能引起状态的更新和UI的重新渲染。
响应式UI:一旦上层状态(如content变量)被更新,这个改变通过自上而下的数据绑定(如value = content)自动反映回UI,更新相应组件的显示内容。这样,事件处理和状态管理形成了一个闭环,使得UI能夠实时响应用户的操作。
总结来说,事件(如onValueChange对应的onContentChange)自下而上的传递体现在它能够影响并更新上层状态,这种机制使得组件能够响应用户的互动,而更新的状态又通过数据绑定机制影响UI的显示,形成一个连贯的响应链条。


Compose 业务上能做的优化大体上就是这些了。总之我们就是我们要保持组件的颗粒度尽可能的小,容易变动的要独立出来,非常稳定的也要独立出来,尽量使用 Immutable 的数据结构。 如此之后, Compose 的流畅度还是非常不错的。

//================================
精简代码 
编写更少的代码会影响到所有开发阶段:作为代码撰写者,需要测试和调试的代码会更少,出现 bug 的可能性也更小,您就可以专注于解决手头的问题;作为审核人员或维护人员,您需要阅读、理解、审核和维护的代码就更少。

与使用 Android View 系统(按钮、列表或动画)相比,Compose 可让您使用更少的代码实现更多的功能。无论您需要构建什么内容,现在需要编写的代码都更少了。以下是我们的一些合作伙伴的感想:

//================================

“对于相同的 Button 类,代码的体量要小 10 倍。”(Twitter)
“使用 RecyclerView 构建的任何屏幕(我们的大部分屏幕都使用它构建)的大小也显著减小。”(Monzo)
““只需要很少几行代码就可以在应用中创建列表或动画,这一点令我们非常满意。对于每项功能,我们编写的代码行更少了,这让我们能够将更多精力放在为客户提供价值上。”(Cuvva)
编写代码只需要采用 Kotlin,而不必拆分成 Kotlin 和 XML 部分:“当所有代码都使用同一种语言编写并且通常位于同一文件中(而不是在 Kotlin 和 XML 语言之间来回切换)时,跟踪变得更容易”(Monzo)

无论您要构建什么,使用 Compose 编写的代码都很简洁且易于维护。“Compose 的布局系统在概念上更简单,因此可以更轻松地推断。查看复杂组件的代码也更轻松。”(Square)
—— https://developer.android.google.cn/develop/ui/compose/why-adopt?hl=zh-cn

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

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

相关文章

适用于 Android 的 几种短信恢复应用程序

Android 设备上的短信丢失可能由于多种原因而丢失,例如意外删除、恢复出厂设置、系统崩溃或病毒攻击。是否有应用程序可以恢复 Android 上已删除的短信?幸运的是,有几款短信恢复应用程序可以扫描您的 Android 手机并从内存或 SIM 卡中检索已删…

CI部署流程简图

🌟🌌 欢迎来到知识与创意的殿堂 — 远见阁小民的世界!🚀 🌟🧭 在这里,我们一起探索技术的奥秘,一起在知识的海洋中遨游。 🌟🧭 在这里,每个错误都…

如何在Java中实现数据库事务?

如何在Java中实现数据库事务? 大家好,我是免费搭建查券返利机器人省钱赚佣金就用微赚淘客系统3.0的小编,也是冬天不穿秋裤,天冷也要风度的程序猿!今天我们将深入探讨在Java应用程序中如何有效地实现和管理数据库事务。…

【Linxu】find命令查询最新修改的文件

find 命令允许我们以分钟或天为单位来查找文件。 分钟用 -mmin 定义,天可以用 -mtime 定义。 在分钟或者天后面还可以定义搜索条件,通过跟上加号()指定数值来查询什么时间之前的文件。 例如,要搜索1分钟(或者24分钟)之前修改过的文件&#xf…

通过 github 分析职业研发数量

如何了解一个开源项目背后,到底有多少职业研发呢?下面以某OLAP数据库公司为例,做一些分析: git log --since“6 months ago” | grep -E “(Enhancement|BugFix|Feature)” -B3 | grep Author | sort | uniq -c | sort -n 通过这个…

测试实习生【面试小结 6.21】

1,自我介绍 2,职业规划,为什么大三没有选择开发? 我规划是刚开始的1~3年内打基础,除了尝试不同的工具和学习新的测试知识外,还要去学习phython/shell 的自动化测试框架,去深入理解性能测试。在技…

头歌——机器、深度学习——人脸识别

第1关:人脸检测 在前面的几个实训中,我们已经学习了人脸识别的基本流程,包括人脸图像采集、人脸检测、特征点提取和人脸识别的整个流程。不仅了解了其中的原理,还学会了编写实际应用的代码。 本实训主要将介绍使用Face Recognit…

CSRF绕过

目录 1. 检查referer referer绕过 2. 检查origin 3. Cookie检查 SameSite 持久性验证 4. Token检查 检测token编码类型,尝试篡改token 绕过token检测 在页面上尝试修改密码, 观察请求的格式. 绕过思路 1. 编写一个js脚本完成以下的任务: 2. 引诱登录的用户触发这…

redis 的内存尽量不要超过 10g,超过 10g 可能会有问题

在使用Redis时,内存大小的限制通常取决于多种因素,包括但不限于: 1. **物理内存**:服务器的总内存大小限制了Redis可以使用的最大内存。 2. **操作系统限制**:操作系统可能对单个进程可以使用的内存有限制。 3. **Red…

【源码】Spring Data JPA原理解析之Auditing执行原理

Spring Data JPA系列 1、SpringBoot集成JPA及基本使用 2、Spring Data JPA Criteria查询、部分字段查询 3、Spring Data JPA数据批量插入、批量更新真的用对了吗 4、Spring Data JPA的一对一、LazyInitializationException异常、一对多、多对多操作 5、Spring Data JPA自定…

7.系统工具——黑马程序员Java最新AI+若依框架项目

目录 前言一、表单构建任务:设计添加课程表单 二、 代码生成1.任务:将部门表在页面端显示改为树形结构 三、系统接口任务:使用sagger进行接口测试 前言 提示:本篇讲解若依框架 系统工具 一、表单构建 功能:完成前端…

欧洲杯赛况@20240623

估计点击标题下「蓝色微信名」可快速关注 老牌劲旅捷克队面对格鲁吉亚,这是两队的首次交锋,格鲁吉亚是很放松的状态,每场比赛对他们都很新鲜,而捷克则谨慎多,至今为止,最倒霉的球员,可能就是捷克…

numpy的array/asarray/asanyarray的格式转化错误问题解决

关于numpy的array()、asarray()、asanyarray() 当前numpy版本:1.26.3 有时一些依赖numpy的旧项目,在运行时,会出现如下错误 ValueError: setting an array element with a sequence. The requested array has an inhomogeneous shape after 1…

SSLCertVerificationError: [SSL: CERTIFICATE_VERIFY_FAILED]

python 在使用websocket 或者request可能会报这个错误,这是证书认证中的错误,如果不是对安全要求高的开发,可以使用下面的方式使request与websocket正常访问 在request中修改一个参数即可正常使用: textmod { "ID&qu…

nvm安装

1、官网下载nvm压缩包 Releases coreybutler/nvm-windows (github.com)https://github.com/coreybutler/nvm-windows/releases 2、安装nvm cmd下查看nvm版本号 nvm version 3、配置镜像 在安装目录下找到settings.txt文件,追加淘宝镜像 node_mirror:https:/…

Java——封装(Encapsulation)

一、封装简介 1、封装是什么 封装(Encapsulation)是面向对象编程(OOP)中的一个基本概念,它指的是将对象的状态(数据)和行为(方法)绑定在一起,并对外隐藏对象…

websocket 安全通信

WebSocket 协议 WebSocket:在 2008 年诞生,2011 年成为国际标准。它允许服务器主动向客户端推送信息,客户端也可以主动向服务器发送信息,实现了真正的双向平等对话。它是一种在单个 TCP 连接上进行全双工通讯的协议,能…

【Python如何输入升高和体重判断你是偏胖还是偏瘦】

1、求体质指数得Python代码如下&#xff1a; # BMI&#xff08;Body Mass Index&#xff09;指数:简称体质指数&#xff0c; # 是国际上常用的衡量人体胖瘦程度以及是否健康的一个标准。 # 常用指标:BMI<18.5 偏瘦 18.5<MBI<24 正常 MBI>24 偏胖 # 计算公式:BMI…

express+vue 在线五子棋(一)

示例 在线体验地址五子棋&#xff0c;记得一定要再拉个人才能对战 本期难点 1、完成了五子棋的布局&#xff0c;判断游戏结束 2、基本的在线对战 3、游戏配套im(这个im的实现&#xff0c;请移步在线im) 下期安排 1、每步的倒计时设置 2、黑白棋分配由玩家自定义 3、新增旁观…

学习面向对象前--Java基础练习题2

买飞机票 需求 机票价格按照淡季旺季、头等舱和经济舱收费、输入机票原价、月份和头等舱或经济舱。 按照如下规则计算机票价格:旺季(5-18月)头等舱9折&#xff0c;经济舱8.5折&#xff0c;淡季(11月到来年4月)头等舱7折&#xff0c;经济舱6.5折。 逻辑 首先输入票价&#xff…