写点什么

拿来吧你,Compose 尝鲜初体验!,Android 开发真等于废人

用户头像
Android架构
关注
发布于: 2 小时前

<TextView/>


<Button/>


<Button/>


</LinearLayout>


之后在 Activity 中创建各种 View 对象,通过命令式写法操作这些对象去设置图片,文字和点击事件等。当点击第一个 Button,我们还需要获取外层的 LinearLayout 对象,动态的 remove 第二个子 Button

2.Compose 写法

Compose 是一种声明式 UI,你需要把界面描述出来,即使界面结构发生变化,你也不需要操纵原来的 View,你需要做的是描述状态发生变化后的界面是什么样子的,以代码为例:


@Composable


fun WelcomePage(){


val state = remember{ mutableStateOf(true)} // ... 获取数据


Column(){


Image(...)


Text(...)


Button(...) // 点击的时候设置 state


if(state.value){


Button(...)


}


}


}


上面的代码中,很清晰的告诉我们,这是一个 Column,对应着原来的 LinearLayout,里面有 ImageTextButton,当状态 state 的值是 true 的时候,会展示另外一个 Button。状态 state 的修改是通过第一个 Button 的点击事件设置的,这里我没有写出来。


Compose 中的重组意味着重建,当 State 发生变化时,描述 UI 的 @Compose 方法会发生重组。用一张图来描述添加 View 的情况:



当然,整个界面重组毕竟是个很高昂的操作,对应着时间、计算能力和电池的消耗,Compose 当然做了优化,只会对必要 @Compose 方法进行重组。比如,上述的 state 发生变化的时候,只会重建 ViewGroupText2


三、为什么要选择 Compose?




声明式 UI 的大哥 Flutter 已经出道很久了,再学习 Compose 还有意义吗,Flutter 还是 Compose


我先抛出我的结论:


  • 如果你想运用到实际的生产环境中,Flutter 肯定是更好的选择,因为更多的人帮你踩过了坑。

  • 如果你想 Kotlin 一把梭,只是学习尝鲜,结合 Android JetpackCompose 可以很好的作为你的技术储备。


简单的聊聊 Compose 中还不错的地方。

1. Android 开发习惯的继承

相信很多同学都有这样的习惯:


  • 使用 Kotlin 开发

  • 必须协程

  • 复杂的布局会使用 ConstraintLayout

  • ...


是的,这些东西我们依然在 Compose 中运用,从而降低我们的上手难度。

2. Android Jetpack 的支持

在 Compose 刚刚发布的时候,Android Jetpack 中的很多其他库都第一时间给予了 Compose 支持,从而丰富了 Compose 的开发生态。


目前,能够直接在 Compose 上使用的 Jetpack 库有:


  1. Navigation

  2. Paging

  3. ViewModel

  4. LiveData

  5. hilt

  6. lifecycle


理论上来讲,Android Jetpack 上跟 UI 不相关的库 Compose 应该都是支持的,在我写的 Hoo 中,就使用了 Paging、Navigation、ViewModel 和 LiveData 等 Android Jetpack 库,再有协程和 Kotlin 的加持,整个开发过程中轻松不少!

3. 更少的代码

Compose 可以使我们更加专注于 UI 的开发,声明式 UI 可以显著的减少方法数和包体积。在谷歌官方的 《Jetpack Compose 使用前后对比》 一文说道:


Tivi 应用在使用了 Compose 后,我们发现 APK 大小缩减了 41%,方法数减少了 17%


其实这些都是可以预见的,比如更加简单的动画和触摸事件的 Api。

4. Preview

Compose 支持代码的 Preview,如图:



Compose 代码写完后,可以直接在右边预览,但是更新速度差点意思,不如 Flutter 的热重载方便。

5. 其他

其他的一些点可能就跟 Flutter 有点像了。


  • Compose 的主题原生支持黑夜模式,开发者定制主题的时候提供两套颜色即可,想起之前,起点读书支持黑夜模式可是花了很大的功夫。

  • 通过 Scaffold,可以轻松集成很多 Material 组件,比如 TopbarFloatingActionButtonBottomNavigationBar 等,这些都可以帮助我们节省出不少的时间。

  • 另外,在 Compose 中不能轻松实现效果的时候,借助于 AndroidView,可以去调用 Android 原生 View。


四、吐槽




当然了,Compose 目前还有一些槽点。

1. 生态不丰富

Compose 作为刚出来的 UI 框架,虽然 Android Jetpack 第一时间给予了支持,但生态不丰富这一点是


《Android学习笔记总结+最新移动架构视频+大厂安卓面试真题+项目实战源码讲义》
浏览器打开:qq.cn.hn/FTe 免费领取
复制代码


毋庸置疑的。


一些非基础的常用 UI,Google 给出了一些解决方案,比如 【accompanist】,它可以帮助你解决部分常用的库。


如果没有你想要的轮子,你只能选择自己造或者引用 Android 原生控件。不过这从侧面也说明了一些机会,当你觉得缺少什么的时候,写出好的开源库的机会来临了~

2. 学习资源少

在学习 Flutter 的时候,遇到某种效果,可能谷歌一下,就有答案了。


但在现阶段的 Compose 中,大概率要自己动手~

3. 导航

作为官方指定的导航 - Navigation,在非 Compose 代码中集成是支持页面之间的过渡动画的,在 Compose 中目前还是不支持的(现在看了一下,有支持的库了)。


Navigation 文档中说明是可以记录页面状态的,但就实际使用而言,有的页面记录状态还是有问题的,比如,纯粹使用 Paging + LazyColumn,当页面切换时,会记录当前页面位置,当加上 Header 就不行了。


当然了,也有可能是我的使用姿势问题。

用户头像

Android架构

关注

还未添加个人签名 2021.10.31 加入

还未添加个人简介

评论

发布
暂无评论
拿来吧你,Compose尝鲜初体验!,Android开发真等于废人