拿来吧你,Compose 尝鲜初体验!,Android 开发真等于废人
<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
,里面有 Image
、Text
和 Button
,当状态 state
的值是 true
的时候,会展示另外一个 Button
。状态 state
的修改是通过第一个 Button
的点击事件设置的,这里我没有写出来。
Compose 中的重组意味着重建,当 State
发生变化时,描述 UI 的 @Compose
方法会发生重组。用一张图来描述添加 View 的情况:
当然,整个界面重组毕竟是个很高昂的操作,对应着时间、计算能力和电池的消耗,Compose 当然做了优化,只会对必要 @Compose
方法进行重组。比如,上述的 state
发生变化的时候,只会重建 ViewGroup
和 Text2
。
三、为什么要选择 Compose?
声明式 UI 的大哥 Flutter
已经出道很久了,再学习 Compose
还有意义吗,Flutter
还是 Compose
?
我先抛出我的结论:
如果你想运用到实际的生产环境中,Flutter 肯定是更好的选择,因为更多的人帮你踩过了坑。
如果你想
Kotlin
一把梭,只是学习尝鲜,结合Android Jetpack
,Compose
可以很好的作为你的技术储备。
简单的聊聊 Compose 中还不错的地方。
1. Android 开发习惯的继承
相信很多同学都有这样的习惯:
使用 Kotlin 开发
必须协程
复杂的布局会使用
ConstraintLayout
...
是的,这些东西我们依然在 Compose 中运用,从而降低我们的上手难度。
2. Android Jetpack 的支持
在 Compose 刚刚发布的时候,Android Jetpack 中的很多其他库都第一时间给予了 Compose 支持,从而丰富了 Compose 的开发生态。
目前,能够直接在 Compose 上使用的 Jetpack 库有:
Navigation
Paging
ViewModel
LiveData
hilt
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
组件,比如Topbar
、FloatingActionButton
和BottomNavigationBar
等,这些都可以帮助我们节省出不少的时间。另外,在 Compose 中不能轻松实现效果的时候,借助于
AndroidView
,可以去调用 Android 原生 View。
四、吐槽
当然了,Compose 目前还有一些槽点。
1. 生态不丰富
Compose 作为刚出来的 UI 框架,虽然 Android Jetpack 第一时间给予了支持,但生态不丰富这一点是
毋庸置疑的。
一些非基础的常用 UI,Google 给出了一些解决方案,比如 【accompanist】,它可以帮助你解决部分常用的库。
如果没有你想要的轮子,你只能选择自己造或者引用 Android 原生控件。不过这从侧面也说明了一些机会,当你觉得缺少什么的时候,写出好的开源库的机会来临了~
2. 学习资源少
在学习 Flutter 的时候,遇到某种效果,可能谷歌一下,就有答案了。
但在现阶段的 Compose 中,大概率要自己动手~
3. 导航
作为官方指定的导航 - Navigation,在非 Compose 代码中集成是支持页面之间的过渡动画的,在 Compose 中目前还是不支持的(现在看了一下,有支持的库了)。
Navigation 文档中说明是可以记录页面状态的,但就实际使用而言,有的页面记录状态还是有问题的,比如,纯粹使用 Paging + LazyColumn,当页面切换时,会记录当前页面位置,当加上 Header
就不行了。
当然了,也有可能是我的使用姿势问题。
评论