拿来吧你,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 就不行了。
当然了,也有可能是我的使用姿势问题。











评论