关于这篇文章,其实本来并没有什么写作计划。触发它诞生的事情是,今天早上,QQ空间给我推了这样一条消息:

image-20220608164528747

一年前的今天,我敲下了第一行的Hello Android for Jetpack Compose,而到今天,我的个人小项目 译站 早已全面转向 Jetpack Compose 。关于 Compose,我也写了几个简易的开源库、作了几篇小文章。所以今天,不妨来谈谈我接触 Compose 的这一年。

本文 不是技术文 ,其中观点仅代表我个人。受限于本人技术水平,难免有误,还望您包容谅解

我接触 Compose 的时间应该还算较早,虽然不是最早的一批,但也算是那时的少数(至少我以为)。彼时,Google 发布 beta 版本,尚且只有 ASBeta 版本支持。为了体验,我将一直使用的AS Stable切成了AS Beta,用默认模板敲出了第一行代码。

我是一个对新技术很感兴趣的人,这可能也是我去学习 Compose 的原因。声明式UI的概念虽然相较View很新奇,但鉴于我接触过VueFlutter,所以也还能上手。

上手是可以上手,但奈何资料确实不多,尤其是中文的。对我来说,早期学习 Compose 的资料基本主要来自Google官网 Youtube 。看着英文资料和视频,我逐渐学会了使用RowColumn,学会了要remember,学会了几种副作用的使用,学会了animate*AsStateanimateVisibility……这段过程中,Youtuber Philipp LacknerCreating Your First Jetpack Compose App 系列对我帮助很大,在此也遥远的表示感谢。

于是,在漫不经心地刷了些视频和文档后,我对 Compose 有了个大体的认识。于是我也想为中文资料做点力所能及的贡献,于是参考这个视频和当时的官方教程,写了第一篇关于Compose的文章

这篇文章的内容其实现在已经过时了,但在当时,Compose中文资料不多的情况下,它的搜索指数居然出乎意料的高。现在你搜索关键词Jetpack Compose 加载图片,可能在前几个结果中还能看到它。

写了文章之后,过了几天,我又感觉除了文章外好像没这方面的中文视频。于是我开了个New App,尝试录了几个视频介绍一些简单概念

image-20220608171648685

录了三个之后我鸽了,好吧,这视频的质量实在是不咋滴。没得设备和技术,而且录视频也是个技术活。但是既然学了,肯定要用啊。于是,我把目光转向了我自己的小项目,译站。

译站

它是我2020年初写的一款简单的翻译小应用,最早是用View实现的。秉持着以用代学的想法,我开始了对这个应用的Compose化。

到九月份,我基本实现了它的主页面。

image-20220608172219346

(忽略这粗犷的 commit ……)

其实这里要说明的是,Compose 的迁移其实并没那么困难。Android 官方提供了非常棒的工具,允许你在View项目中部分使用Compose、或者在Compose中部分使用View。如果你原先的架构合理,ViewModel没有非常强的耦合,那么其实改造起来很容易。LiveData或者Flow都可以通过.observeAsState一键转换成可以在 Compose 中使用的 State(Compose 的 UI 由 State 驱动)。我这里之所以花了那么久,有两个原因:

  • 一是我正好在重构代码的全部逻辑,包括一些类的分离、一些流程的改变等。秉持着一不做二不休的想法,我选择了把页面全部用 Compose 重写(而不是只改变一部分),故而比较花时间
  • 二是有一些很简单的效果实现起来并没有那么容易,尤其是在中文资料极度匮乏的情况下。出了问题或者想实现什么效果,除了翻官方的网站就是翻 Github,这也比较花时间。

总之,在各种折腾下,译站的 Compose 版本也逐渐重构完成了,并在那之后均用(准确来说除了悬浮窗和CodeView) Compose 完成各种 UI 效果。

不断学习与博客

其实对我个人来说,开始学习 Compose 的时候有一个很困惑的点:不知道学完基础之后该学啥了。一方面是资料确实不多,而且视频教程也都是围绕着基本控件之类的来讲;二是我自己没有很大的东西去细究 Compose 的实现。于是三天打鱼两天晒网的,在不断更新应用的间隙间,也偶尔地学习一些新东西。

这里很感谢的一份资料是 RugerMc 大佬牵头做的 jetpack-compose-book: Jetpack Compose 基础教程,持续更新 ,很详细的介绍了 Compose 各个方面的使用。对于现在卖课混杂、培训遍地、营销漫天的中文互联网社区环境来说,这样无私的技术分享、开源布道的精神真是说得上不多见了。我自己也为这个项目提了绵薄的几个PR。互联网技术的精神应当在于包容、共享、探索、钻研,至少我是这样觉得的。

这段时间,不少大佬们的博客也在惊艳着我,比如程序员江同学fundroidPetterp路很长OoO等,在我学习 Compose 的路上,他们的文章给了我很大帮助,再次均表示感谢。

对我来说,尽管我是一个很懒的人,但我还是也尝试着写起了 Compose 相关的文章。一是助于自己提升,二是为中文资料做点绵薄贡献。一点点,到现在我也已经写了13篇关于 Compose 的文章了。或许不足为道,但若是有人看到,说,这个不错,对我有帮助,那便足够了。

其中我自己觉得比较好玩的是 Jetpack Compose 自定义布局+物理引擎 = ? 这一篇。在那里,我用 Compose 自定义布局实现了这样的效果

PhysicsLayout演示_.gif

没有用,但很有趣。这个想法出现在我高三的时候,但是一直觉得会很难就一直不想做,直到前几天下定决心做了做。在巨人的肩膀上,花了两天就实现了。感觉也蛮有成就感的。如果您感兴趣,可以在Github查看完整源代码

总结

说点正题的话,就我个人而言,我觉得 Compose 开发有以下优劣:

  • 代码即 UI,灵活、迅捷 (比如 for 循环创建几个控件,if 判断显不显示)
  • 对各种需求高度、统一的封装 (通过 LocalXXXrememberXXX 获取和操作各种东西,动画、软键盘、状态栏…… )
  • 允许逐步迁移 ( View 体系 和 Compose 体系可良好共存)
  • 字面量热重载 (对于类似于 大小、字符串 的修改可直接反映到 App 上)
  • 快速的 UI 搭建,无需过多考虑嵌套

但就目前来说,也有些问题

  • 部分硬需求尚不完善,比如还没有瀑布流布局等
  • 性能(如 滑动列表)上较传统 View(如 RV)仍有差距
  • 目前中文资料较为欠缺,部分需求实现需要自己摸索
  • 精通难度大( Compose 编译原理、性能优化等)

如果你是一个希望尝试的同学,我个人推荐这些资料(它们是免费的,如果你想学付费的请自行寻找,我不卖课):