写点什么

Jetpack Compose 1

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


基于 Kotlin


=========================================================================


现行的 Andoird 开发体系:Java + xml,但近年来 Google 已经宣布 Kotlin 是 Android 开发的第一语言。Jetpack Compose 这套声明式 UI 采用的底层 DSL 是 Kotlin,即 你在使用 Jetpack Compose 开发 UI 时,实际上是使用 Kotlin 进行 UI 开发,「即 完全统一了 Android 开发语言。」




声明式开发


======================================================================


现行的 Andoird 视图体系属于传统的命令式开发方式:使用 XML 布局、通过 findViewById 获取控件的引用,命令式地更新状态、刷新 UI。命令式 UI 开发的特点是:


  • UI 可变:接受命令后通过变化自身刷新 UI

  • UI 持有状态 State:控件的变化通过改变自身状态实现


Jetpack Compose 使用的是声明式 UI 开发方式,其特点相对于命令式 UI 开发有较大区别:


  • UI 不可变 : @Composable 函数不返回任何可引用句柄,无法被外界改变;

  • UI 不持有 State: @Composable 函数无法持有状态,显示的数据都需要通过参数传入;


总的来说,Jetpack Compose 进行声明式 UI 开发时:


  1. 每个 UI 绘制会一个“纯函数”的方式运行;

  2. 当 状态 State 变化时函数重新执行刷新 UI。




UI 刷新机制


=======================================================================


Jetpack Compose 刷新 UI 的方式叫重组,即使用新数据再次调用 UI 绘制的函数。


@Composable


fun ClickCounter(clicks: Int, onClick: () -> Unit) {


Button(onClick = onClick) {


Text("I've been clicked $clicks times")


}


}


如上述按钮设置:每次点击该按钮时,调用方都会更新 clicks 的值。Compose 会再次调用 lambda 与


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


Text 函数以显示新值。


当数据变化时就会触发重组,如果每次都全量重组则会带来很多性能损耗。「类似 React 那种声明式 UI, 每次绘制时都会通过 diff 算法精准更新 DOM 从而实现局部刷新,最终保证 React 的刷新性能。」


Jetpack Compose 为了保证重组性能才使用了类似的思想:「局部刷新,也叫智能重组」。原理是:在 Gap Buffer 这样线性结构上进行 diff。


「Gap Buffer 是一个树形结构经 DFS 处理后的数组」,数组单元通过 key 标记其在树上的位置信息。Compose 在编译期为 Composable 生成带有位置信息的 key 存入到 Gap Buffer 数组的对应位置。运行时根据 key 来识别 Composable 节点是否发生了位置变化,最终决定是否参与重组。同时,「Gap Buffer 还会记录 Composable 对象关联的状态(State 或 Parameters)」:仅当关联状态变化时,Composable 才会参与重组。




状态管理(State)


============================================================================


Jetpack Compose 的 UI 变化本质是:「状态(State) 驱动」,即控件 UI 的变化原因是控件 UI 的状态发生了变化。


对于传统的 UI 开发模式,状态(State) 只是 UI 控件的一个属性,仅此而已。




UI 组件类型


=======================================================================


虽然 Jetpack Compose 1.0 才刚面世,但实际上其 UI 组件库已经十分完备,几乎完全覆盖了 Android 现有视图系统的所有组件及能力,主要包括:


  • 基础 UI 组件,如 Button、TextView 等,连 Card、Fab、AppBar 等 Material Designe 的控件都会涵盖;

  • 列表类组件,如 List 等,采用 items{…} 中创建每条项目的 Composalbe,避免了额外的 Adapter 适配;

  • 布局类组件,提供了多种容器类 Composalbe,可以十分高效方便地对子组件进行布局;通过一系列链式调用的 Modifier 操作符来装饰 Composable 的外观。操作符的使用十分丰富,如 size、backgrounds、padding 等;

  • 动画组件,同样是采用状态(State)驱动进行动画效果的实现。




实时预览


=====================================================================


Jetpack Compose 能做到开发过程中的**「实时预览」**,预览机制可以做到与真机无异,真正的所见所即得。





兼容性


====================================================================


Jetpack Compose 可以与 Android 现有的视图 View 开发体系一起兼容使用,即不一定是新有项目才使用 Compose,「而是可以对已有项目引入 Compose。」





Jetpack Compose 与 Flutter 的关系


=============================================================================================


同属于 UI 开发框架,二者都是采用**「声明式 UI 开发」**,但二者并不存在互斥或者竞争关系。


因为:「Jetpack Compose 存在于 Android 的原生 UI 绘制体系、Flutter 主要还是应用于跨平台的 UI 绘制范畴内。」


但二者都是代表未来 Android UI 绘制的开发方向:「声明式 UI 开发」

用户头像

Android架构

关注

还未添加个人签名 2021.10.31 加入

还未添加个人简介

评论

发布
暂无评论
Jetpack Compose 1