iis服务器助手广告广告
返回顶部
首页 > 资讯 > 精选 >写给初学者的Jetpack Compose教程,为什么要学习Compose?
  • 568
分享到

写给初学者的Jetpack Compose教程,为什么要学习Compose?

androidjetpackcomposecomposekotlinandroidx 2023-08-19 09:08:39 568人浏览 薄情痞子
摘要

本文同步发表于我的微信公众号,扫一扫文章底部的二维码或在微信搜索 郭霖 即可关注,每个工作日都有文章更新。 终于下定决心要写这个系列了。 前段时间刚在公众号上分享了一篇关于 Jetpack Compose动画 的文章,看到了评论区有这

本文同步发表于我的微信公众号,扫一扫文章底部的二维码或在微信搜索 郭霖 即可关注,每个工作日都有文章更新。

终于下定决心要写这个系列了。

前段时间刚在公众号上分享了一篇关于 Jetpack Compose动画 的文章,看到了评论区有这样一条留言。

在这里插入图片描述

不管这个问题是疑问还是反问,其实类似的观点我也着实看过不少。因此,在正式开始写这个系列的文章之前,我觉得有必要先写一篇序章,我们真的就来纯粹地聊一聊,到底为什么要学习Jetpack Compose?

事实上,Jetpack Compose对于我来说是必写的一个系列,只是时间早晚的问题。

想一想,之前大家还经常会吐槽Google怎么又又又出新技术了,直呼跟不上了,学不动了之类的。而现在,随着移动开发热度的逐渐降低,有没有发现其实Android已经挺长时间没什么重大的新技术让我们学习了。

即使Android系统仍然还是保持每年一个版本的更新,但现在基本都是一些隐私和安全性上的提升,很少再能看到有什么重大的功能突破了。

而Jetpack Compose可以说是近几年里Android开发领域最大的一次更新,且未来的Android程序开发一定会全面向Jetpack Compose转型。只要你还在从事Android开发工作,这就是你必然不可能跳过的知识。

当然,严格意义上讲,Jetpack Compose也不能算是新鲜技术了。Google最早在2019年的I/O大会上就推出了Jetpack Compose的首个alpha版,并于2021年发布了1.0正式版。如今算下来,也已经有四个年头了。

我记得我应该是在很早的阶段就对Jetpack Compose进行了尝鲜,但当时体验下来的结果让我直摇头。

首先,alpha版的Jetpack Compose性能很差,开发工具兼容得也不好,记得当时必须得用Canary版的Android Studio进行开发。

当然,这都不算什么,最重要的是,api极其不稳定。

要知道,那个时候网上关于Jetpack Compose的资料还很少,好不容易找到一篇讲解的文章,照着去实现的时候发现API已经变了,按文章中的写法连编译都过不去。因此,我当时也就打消了写Jetpack Compose文章的念头。

但是现在一切都不一样了。

经过四年多的迭代,Jetpack Compose现在已经相当成熟和稳定,并且绝大多数使用View能完成的效果,现在使用Jetpack Compose同样都能够完成。

再加上考虑到现在国内Jetpack Compose的普及率仍然很低,因此我觉得现在是时候开始写写Compose相关的文章了。

我给这个系列起名叫“写给初学者的Jetpack Compose教程”,这是因为我自己就是初学者。我希望能够完全站在初学者的角度上边学边写,看完这个系列后大家能对Jetpack Compose有一个比较全面的认识。

简单起见,从这里开始,我们将Jetpack Compose简称为Compose。

本篇文章是这个系列的第一篇文章。

第一篇文章我并不打算直接去讲Compose很细节的知识点,我们先从比较宏观的角度认识一下什么是Compose?以及什么我们要使用Compose?

首先解释一下什么是Compose。

Compose是一个由Google Android团队官方推出的声明式UI框架,它的本质就是用来编写界面以及处理与用户交互相关的逻辑的,你可以理解成它是View的替代品。

声明式的UI框架和传统的View区别非常大,但是具体的区别我感觉无法在这里进行详细的描述,因为对于初学者来说可能很难看懂这些纯概念性的描述。等随着后面具体的学习,大家就能直观性地感觉到声明式UI框架与View的巨大区别了。

接下来我们讨论一下,为什么要使用Compose?

有不少朋友可能在之前就已经或多或少了解过Compose,也有读者朋友也跟我反馈过,并不喜欢Compose的这种声明式写法,以前的View用得好好的,为什么Google还要再发明一个新的UI框架来替代View?

那么我们可以先来审视一下,View真的是好好的吗?

首先,站在开发者的角度,View有一个不太友好的地方,就是界面通常都是使用XML来编写的,而系统先需要读取并解析每一个XML文件,然后再将它们展示到界面上。

读取并解析XML是需要时间的,在主线程中进行这个操作还有可能会造成ANR,因此Google为此还推出了像AsyncLayoutInflater这样的API来异步加载解析XML。

而如果你尝试完全不用XML,全部都是通过在代码中手写UI布局,具体有多么难写相信大家都是知道的。

所以其实你也可以将Compose理解成是Google官方提供了一个允许我们以纯代码的形式手写UI布局的方式。

其次,站在Google的角度,View也并不是好好的。我们都知道,View是Android系统中的一个极其重要的组件,它是随着系统发布的。而随着系统发布的组件都会有一个头疼的问题,更新和维护会非常困难。

举一个具体的例子,ImageView就是随系统发布的一个View,我们无须引入任何第三方库就能直接使用它。但是,Google如果现在想要对ImageView的功能进行更新怎么办?你会发现,除了升级操作系统外是没有任何其他办法更新的。

但即使是升级了操作系统,旧版系统上的ImageView仍然还是老的,为此Google就只好推出像ImageViewCompat这样的API,Android里各种Compat的API相信大家也都见过不少。

所以,后来Google就很少再推出随系统发布的View了,更多都是随着AndroidX发布的,而Compose当然也是属于AndroidX的一部分。如果想要了解更多关于AndroidX的内容,可以参考我的这篇文章 总是听到有人说AndroidX,到底什么是AndroidX?

最后,View真的已经太老太老了,它是随着Android 1.0系统发布的,至今已经过去了十几个年头。View的历史包袱太重,维护起来也变得越来越困难。因此,Google无论如何都觉得应该推出一套全新的UI框架了,而这就是Compose。

刚才有说过,Compose是一个声明式的UI框架。不管你喜不喜欢这种声明式的形式,这都不是Google首创的,Google只是顺应了时代的潮流。

至于谁是引领时代潮流的声明式UI框架?那首先肯定不可能是Compose,当然也不会是隔壁的SwiftUI。大家最先想到的或许会是Flutter,毕竟这个名气很大,用的人也很多,Compose和SwiftUI在很大程度上还是借鉴的Flutter。

但实际上,前端框架React早在10年前就已经开始使用这种声明式的语法理念,并且逐渐将它发扬光大。

那么说了这么久的声明式,那么到底什么才是声明式呢?

我们可以将声明式理解成是一种编程思维,只要你的UI框架是基于这种编程思维来使用的,那么就可以称之为声明式UI框架。

具体是什么编程思维呢?我们还是拿View来进行举例。

View肯定不是声明式的,它更多是一种过程式的思维。我们在描述一个View的时候是不会描述它的状态的,或者只会描述它的初始状态。

那么后期想要更新这个View的状态怎么办呢?这个大家一定熟悉,就是先调用findViewById()方法来获取到这个View的实例,然后再通过setXXX来更改它的状态,如setVisibility、setBackground等等。

这种就是过程式的思维。

那这种编程思维有什么不好的吗?好不好其实都是对比出来的,在没有声明式之前我也没有觉得这种过程式的思维有什么问题,待会我们会看具体的比较示例。

那声明式的思维又是什么样的呢?

它的工作流程有点像是刷新网页一样。即我们仍然正常地去描述一个控件,但这次要附带上它的状态。然后当有任何状态需要发生改变时,只需要像刷新网页一样,让整个界面上的所有元素全部刷新一遍,那么自然所有状态都能得到更新了。

如果你是初次听到这种逻辑,一定会感到震惊。什么?为了更新一个控件的状态,让整个界面上的所有元素全部刷新一遍?那这程序的运行效率不得卡到完全没办法使用?

没错,如果不做任何优化的话,确实会是这个样子,但很明显Google不会让这样的事情发生。

事实上,所有的声明式UI框架在这里都会采取相似的优化策略,那就是在刷新界面的时候只会去更新那些状态有变化的控件,而那些状态没有变化的控件在界面刷新的时候则会跳过执行。

空口讲了这么久,我们现在稍微看一段简单的代码来理解一下这部分逻辑吧:

@Composablefun HelloCompose(date: String, weather: String) {    Column {        Text("$date")        Text("$weather")    }}

这是一段Compose代码,在这里我们放置了两个Text控件用来显示两行文字,其中date用于显示日期,weather用于显示天气。

那么当界面内容发生更新的时候,只需要对这个HelloCompose()函数进行刷新,并传入相应的参数即可。但是请注意,如果传入的参数和上次并没有发生变化,那么就没有任何控件会发生更新。如果date有变化,而weather没有,那么就只有第一个Text控件会发生更新,第二个Text控件丝毫不会受影响,反之亦然。

重新刷新界面以此来更新界面内容的这个过程我们称之为重组。Compose会保证,每次重组永远都只会去更新那些必要的控件,状态没有发生变化的控件是不会更新的,以此来保证运行效率。

至于Compose是如何做到这点的,它的基本原理是利用观察者的机制来去记录哪些控件需要更新,但如果想要详细地解释清楚会非常复杂。我觉得作为初学者,能使用好Compose就已经很不错了,暂时没有必要去卷它底层的工作原理。等到了这个系列的后期,我可能会再去写一写这方面的内容。

现在,你已经对Compose和声明式UI有一点点的了解了。刚才我们有说到,要对过程式和声明式的写法进行一下对比,现在就来看看吧。

比如用户进入我们App的首页,首页内容的加载是需要一些时间的,通常这个时候我们会先显示一个加载框或者是占位图给用户,等首页内容加载完成之后,再把加载框隐藏掉,将正常的首页呈现给用户。而如果加载过程中遇到了一些问题,比如说用户的手机没网,这个时候就展示一个错误页面给用户。

这是一个非常常见的需求,那么长久以来我们都是如何实现这个功能的呢?代码如下所示:

fun refreshHomePageVisibility(Status status) {    when (status.current) {        Status.SUCCESS -> {            homePageView.visibility = View.VISIBLE            loadingView.visibility = View.GONG            errorView.visibility = View.GONG        }        Status.LOADING -> {            loadingView.visibility = View.VISIBLE            homePageView.visibility = View.GONG            errorView.visibility = View.GONG        }        Status.ERROR -> {            errorView.visibility = View.VISIBLE            loadingView.visibility = View.GONG            homePageView.visibility = View.GONG        }    }}

可以看到,这里我们通过一个refreshHomePageVisibility()函数来去刷新首页可见控件的状态。homePageView表示正常的首页内容,loadingView表示加载等待框,errorView表示错误页面。

当首页内容加载成功的时候,我们将homePageView设置成VISIBLE,将loadingView和errorView设置成GONE。

当正在加载首页内容的时候,我们将loadingView设置成VISIBLE,将homePageView和errorView设置成GONE。

当首页内容加载失败的时候,我们将errorView设置成VISIBLE,将loadingView和homePageView设置成GONE。

有没有觉得这段代码真的很繁琐,而且如果不细心的话还很容易写错,从而会导致应该显示的View和应该隐藏的View出现混乱。

这种代码其实我们经常会写,但是没有人会去指出这有什么问题,因为不这么写还能怎么写呢?过程式的思维就只能是这个样子。

但是有了Compose就一样了,用声明式的思维来去编写这类UI界面,你会发现逻辑会变得特别清晰明了。代码如下所示:

@Composablefun HomePage(Status status) {    when (status.current) {        Status.SUCCESS -> {            HomePageContent()        }        Status.LOADING -> {            LoadinGContent()        }        Status.ERROR -> {            ErrorContent()        }    }}

这里的HomePageContent()、LoadingContent()和ErrorContent()都是Compose函数,分别用来显示正常的首页内容、加载等待框和错误页面。

然后我们在HomePage()函数中只需要根据参数中传入的状态来决定是调用HomePageContent()、LoadingContent()还是ErrorContent()函数即可。

为什么使用Compose来实现同样的功能逻辑会变得这么简单?因为这就是声明式UI的特点。当HomePage()函数传入的参数发生变化时,这个函数就会触发重组,从而对界面内容进行刷新。那么界面都刷新了,首页内容、加载等待框和错误页面的可见性自然都会调整为正确的状态,所以不需要我们再去手动设置visibility属性了。

另外效率的事情大家也完全不用担心,刚才已经说了,重组永远都只会去更新那些必要的控件。HomePageContent()、LoadingContent()和ErrorContent()这3个函数都没有接收任何参数,因此它们内部的控件在重组过程中都不会被更新,只有最外层控件的可见性状态会发生改变,效率等同于我们刚才手动设置visibility属性的方式。

这样,我们就通过一个非常简单的例子比较直观地理解了Compose的优越性,希望这能回答许多人心中的“为什么要学习Compose”的疑问。

当然,Compose的优越性远不止这些,但是也不要因为这一个例子就觉得Compose很美好。因为这个例子实在太简单了,而Compose总体上来说仍然是非常庞大的一套系统,想要把它完全搞懂并不容易,还是要花很大的功夫的。

今天的这篇文章是这个系列的序章,我们还并没有通过一个实际可运行的例子来去学习如何编写Compose程序,但是希望这篇文章能提起大家对Compose的兴趣,我们会在本系列后续的文章当中慢慢上手Compose编程。


Compose是基于Kotlin语言的声明式UI框架,如果想要学习Kotlin和最新的Android知识,可以参考我的新书 《第一行代码 第3版》点击此处查看详情

来源地址:https://blog.csdn.net/guolin_blog/article/details/130783168

--结束END--

本文标题: 写给初学者的Jetpack Compose教程,为什么要学习Compose?

本文链接: http://www.lsjlt.com/news/375243.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • 写给初学者的Jetpack Compose教程,为什么要学习Compose?
    本文同步发表于我的微信公众号,扫一扫文章底部的二维码或在微信搜索 郭霖 即可关注,每个工作日都有文章更新。 终于下定决心要写这个系列了。 前段时间刚在公众号上分享了一篇关于 Jetpack Compose动画 的文章,看到了评论区有这...
    99+
    2023-08-19
    android jetpack compose compose kotlin androidx
  • 初学者学习SEO需要掌握什么
    这篇文章给大家分享的是有关初学者学习SEO需要掌握什么的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。  一、前端技能  之所以在seo技能中提到前端,主要还是因为你要学会看懂简单的html代码,会简单的书写htm...
    99+
    2023-06-10
  • 推荐给初学者的五个适合学习Go语言的课程
    随着信息技术的快速发展,编程语言的重要性也日益凸显。作为一门新兴的编程语言,Go语言因其简洁、高效和易学的特点而备受关注。越来越多的初学者选择学习Go语言,因此,本文将推荐五个适合初学者的Go语言课程,帮助他...
    99+
    2024-01-30
    "Go入门课程" "Go基础教程" &q
  • Python 学习笔记:哪个教程是最适合初学者的?
    Python 是一种高级编程语言,它简单易学,适用于各种任务。如果你想学习 Python,你可以选择一些优秀的教程来帮助你入门。 但是,哪个教程是最适合初学者的呢?在本文中,我们将介绍几个最受欢迎的 Python 教程,以及它们的优点和缺...
    99+
    2023-10-27
    学习笔记 ide 教程
  • 为什么JavaScript是初学者的好选择
    本篇文章为大家展示了为什么JavaScript是初学者的好选择,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。有充分的理由,JavaScript是Web开发中使用的事...
    99+
    2024-04-02
  • 为什么要选择学习python?学习python的原因!
      python是一门非常不错的编程语言,广受初学者的喜欢,越来越多的人都想要学习python。不过对于不太了解的人来说,都会疑惑为什么要学习python呢  很多人都知道python是一种计算机语言,具有简洁性、易读性以及可扩展性,相对于...
    99+
    2023-06-01
  • Python 机器学习初学者教程:一步一步构建你的第一个机器学习模型
    机器学习正以令人难以置信的速度改变着我们与世界互动的方式。从自动自动汽车到医疗诊断,机器学习现在在许多不同领域无处不在。如果你想开始自己的机器学习之旅,那么这份Python机器学习教程非常适合你。我们将从基本概念开始,一步一步地帮助你建立...
    99+
    2024-02-14
    Python 机器学习 机器学习项目 机器学习算法 机器学习模型
  • ASP 关键字 IDE 学习笔记:最适合初学者的学习方法是什么?
    ASP(Active Server Pages)是一种基于服务器端的 Web 应用程序开发技术,它通过动态生成 HTML 页面来实现与用户的交互。在学习 ASP 的过程中,掌握 ASP 关键字和使用 IDE 是非常重要的。那么,对于初学者...
    99+
    2023-09-07
    关键字 ide 学习笔记
  • 为什么设计师需要学习编写代码
    这篇文章主要介绍了为什么设计师需要学习编写代码,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。做现实可行的设计有了一个最终产品将如何实现的明确印象,设计师将拿出更多实际可行的概...
    99+
    2023-06-08
  • PHP程序员为什么要学习GO语言
    PHP程序员为什么要学习GO语言,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。很多人将GO语言称为21世纪的C语言,因为GO不仅拥有C的简洁和...
    99+
    2024-04-02
  • 为什么入门学习编程要选择Python
    本篇内容介绍了“为什么入门学习编程要选择Python”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!下面,我们对比几大主流编程语言的代码量,以...
    99+
    2023-06-04
  • ASP基础知识:为初学者量身定做的入门教程
    ASP(Active Server Pages)是一种创建动态网页的服务器端技术,它使开发人员能够在网页中嵌入脚本代码,以便在服务器上执行。ASP代码通常使用VBScript或JScript编写,并且可以直接在HTML文件中嵌入。 ASP...
    99+
    2024-02-05
    ASP 服务器端编程 动态网页 Web开发 应用程序开发
  • 为什么Java的开发者应该学习NumPy,而Laravel的开发者应该学习对象操作?
    在软件开发领域,每个开发者都有自己的专业领域和技能。然而,为了成为一名全面的开发者,我们需要学习不同的技能和工具,以便更好地应对各种挑战。在本文中,我们将探讨为什么Java的开发者应该学习NumPy,而Laravel的开发者应该学习对象操...
    99+
    2023-06-23
    laravel 对象 numy
  • 你需要使用什么 IDE 来学习 Java API 教程?
    Java是一种广泛使用的编程语言,它拥有强大的类库和API。学习Java API对于想要深入学习Java的开发者来说非常重要。然而,学习Java API需要使用一些工具来帮助我们更加有效地学习和理解。在这篇文章中,我们将讨论使用哪些IDE来...
    99+
    2023-06-22
    api 教程 ide
  • Python学习教程:Python的cors跨域模块主要做了什么?
    在当下web开发环境下,前后端分离开发是一个比较主流的架构模式。那么因为不再是模板化开发,以至于前后端有可能不在一个域下(即服务器的域名是www.a.com, 客户端域名是 www.b.com),这就造成了 浏览器跨域禁止的问题。Pytho...
    99+
    2023-06-02
  • PHP 容器学习笔记:为什么容器是重要的?
    作为一名 PHP 开发人员,你可能听说过容器这个词。那么,什么是容器?为什么容器在 PHP 开发中如此重要?本篇文章将为你详细介绍。 容器是什么? 在软件开发中,容器是一种虚拟化技术。它允许开发人员在同一台物理机器上运行多个相互隔离的应用...
    99+
    2023-09-21
    学习笔记 容器 数据类型
  • 适合Java开发者学习的Python入门教程是怎么样的
    适合Java开发者学习的Python入门教程是怎么样的,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。从哲学的角度来讲,Python几乎是与Java截然相反。它抛弃了静态类型...
    99+
    2023-06-17
  • GO语言教程:如何从零开始学习,成为一名优秀的开发者?
    Go语言是一种开源的编程语言,由谷歌公司开发。它结合了C++和Python的优点,具有高效、安全、简单等特点,因此备受开发者青睐。如果你想成为一名优秀的开发者,那么学习GO语言是一个不错的选择。 本文将从零开始介绍GO语言的基础知识,帮助...
    99+
    2023-06-28
    学习笔记 教程 开发技术
  • 想要成为 PHP 索引 shell 大师?这些教程是你必须学习的!
    PHP索引Shell是一种功能强大的命令行工具,它可以让你通过命令行访问和操作文件系统。它可以用来执行各种任务,例如查看目录结构、创建和删除文件、修改文件权限等。如果你想成为PHP索引Shell大师,那么你需要学习以下教程。 PHP索引S...
    99+
    2023-10-29
    索引 shell 教程
  • 想成为一名高级的LeetCode算法工程师,你需要学习什么?
    随着人工智能和大数据时代的到来,算法工程师的需求量也越来越大。LeetCode作为一家专注于算法面试准备的网站,它的题库被广泛应用于各大公司的面试中。在这篇文章中,我们将探讨成为一名高级的LeetCode算法工程师所需要学习的知识点和技能...
    99+
    2023-06-14
    编程算法 leetcode bash
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作