一.Jetpack Compose起步

542 阅读6分钟

1.1.android开发现状简介

第一部Android智能手机发布于2008年10月,距现在已有13年。十多年的时间,无论是系统本身还是依附于系统的开发技术,都经历了漫长的发展,积累,和沉淀,各种细则都趋于完善,本节主要介绍一下android开发技术的历史以及现状,只有了解了历史,才会知道compose出现的原因。

1.1.1 野蛮奔放的年代

初期的Android系统是野蛮奔放的,普通应用可以轻易获得比较敏感的权限,比如笔者的首部手机红米note2,搭载的是android5.1系统,在这个系统上,第三方app可以不经用户允许就获得读写sd卡权限,导致的后果就是sd中充满了各种不知道哪个app创建的目录,以及任何应用都可以轻易读取用户相册等隐私文件。 android开发技术也是简单随意的,各种逻辑全部写在activity中,笔者曾亲眼见过6000多行的activity,想来就算有超过1w行的activity也不奇怪。这么做导致的最显著的问题就是代码变得难以维护,试想一下,在几千行的一个文件中寻找你想要找的逻辑是多么的痛苦,稍微修改一下也可能会引发新的未知的bug。

1.1.2 黎明的曙光-MVP,MVVM

当矛盾积累到一定阶段,当目前的开发手段无法满足app快速迭代的需要,那么必然会有新的架构出现尝试去解决问题,MVP和MVVM这两种架构便是这一阶段的产物,他们如何去解决的呢?这里不做过多介绍,给人最直观上的看法就是,将之前写在activity中的那一坨代码给移到别的地方去,MVP是弄到了Presenter中,MVVM是弄到了ViewModel中,并且通过一些框架工具实现了数据的双向绑定,这样一搞,看起来似乎逻辑变得更清晰了,各个类的职责也变得更明确了.

1.1.3 另辟蹊径?-React Native,Flutter

人们除了在某一端探索外,在跨平台领域也有着十足的探索,React Native和Flutter便是其中两种比较著名的方案,笔者对React Native不太了解,对Flutter有过一段时间接触,接下来的文章中,也会有Flutter和jetpackcompose的对比,当然完全不了解Flutter也不会影响你学习和掌握Compose,Flutter完全抛弃了传统Android app的开发,采用的新的开发语言,新的思想--也就是响应式开发,这点和Compose是一样的,你能明显地在Compose中看到Flutter的影子

1.1.4 官方出手 - jetpack

先明确jetpack是什么,jetpack本质上是google推出的工具包,里面有很多google觉得好用并且推荐开发者使用的库,包括Lifecycle 、ViewModel等等,目的是用来统一Android开发生态,让开发者可以简单快速地开发处出高质量的app,计划是美好的,当然目前未知效果也是很不错的,越来越多的项目使用ViewModel,LiveData等jetpack中好用的库,而本系列博客要介绍的jetpack compose,便是google推荐的一种全新的响应式的UI开发库。


1.2 jetpack compose初探

1.2.1.JetpackCompose是什么?

Jetpack Compose(以下简称Compose)是用于构建原生Android UI的现代工具包。 Compose使用更少的代码,强大的工具和直观的Kotlin API,简化并加速了Android上的UI开发,这是官方对它的描述。从描述中我们可以看到,Compose 是一个Android UI工具包,目的是为了简化和加速Android上的UI开发。

1.2.2.为什么会出现这样一个东西?

新的事物的出现,往往是为了解决现存的一些问题,比如Flutter的出现是为了解决同一个App跨平台的问题,同时在一定程度上也解决了UI一致性的问题,插件化技术的出现,是为了解决动态化和热修复的问题,一定程度上也缓解了包大小的问题。鸿蒙操作系统的出现是为了解决操作系统被卡脖子的问题等等。所以Compose是想要解决什么问题呢?其实在上一节“Compose是什么”里已经提到过了,那就是,目前AndroidUI开发太麻烦了,google想通过这个工具来简化它。

1.2.3.Compose的特点

好了既然我们已经知道Compose的目的是为了简化Android开发,那么究竟是如何简化的呢?相信有一部分同学听说过Compose是声明式UI框架,之前Android的View体系是命令式UI框架, 那么这两种UI框架的区别是什么,以及哪个类型的更好呢? 用一句话来描述:

  • 命令式 UI 就是命令框架怎么做,最终达到我们做什么的目的。
  • 声明式 UI 就是告诉框架做什么,具体怎么做我们不关心。 举个简单的例子,在目前Android的View体系中,我们想要修改界面上的一个TextView的内容,该如何做呢?首先我们需要通过View的id找到这个View对象,然后再给这个View下命令,对他说我命令你把你的字符串改成XXX,TextView的字符串属性被修改,在下一次界面重绘后显示为最新的内容。 下面再看Compose的声明式UI是怎么做的,首先我们写Compose UI代码的时候,构成界面元素的只是一些加了@Compose注解的函数,所以就找不到这个View对象,更不可能通过命令的方式给这个View对象设置一些属性,那么我们如何更新UI呢?在Compose中,UI数据是从更顶层的Compose函数中一层层传下来的,我们想要更新数据,其实只需要修改传下来的数据,让UI重新构建一次就可以了。 好了现在我们知道这两种UI框架的区别以及各自的特点了,那么哪种方式更好呢? 不知道。 罗卜青菜各有所爱,不过从google的一系列举动来看,google官方是更推荐响应式UI的,从Flutter和Compose都能看出来,这里不做过多探讨,我们只讲技术,不设立场。

1.3 JetpackCompose环境搭建

相比Flutter环境的搭建,Compose环境的搭建可以说是非常简单了,甚至可以说根本就不需要搭建,你只需要下载一个最新的支持Compose的androidstudio就可以,不过目前只有Studio的Canara版本支持developer.android.google.cn/studio/prev… 。当然Compose正式版发布后,最新版的正式版Studio也一定会支持的,到时候Studio更新最新版就可以了。

新建Compose项目的话,只需要在选择Activity的时候选Empty Compose Activity,就会自动引入所需要的Compose依赖, 旧项目想要使用Compose也十分简单,也是新建一个空的ComposeActivity,会自动帮你引入依赖,需要注意的是,Compose需要的Gradle版本较高,同时miniSdkVersion需要在21及以上,Kotlin 版本需要在1.4.32及以上,如果引入失败,大部分情况是旧项目的这些版本有问题。 好了了解了Compose是什么以及环境的搭建,下一章会介绍如何使用

1622971642(1).png