1. Jetpack Compse是什么

Jetpack Compose 是Android新一代UI开发结构,采用声明式开发范式,开发者只需求将注意力放在怎么编写UI界面上,当需求渲染的数据发生改变时,结构会主动完结UI改写,其次它运用Kotlin DSL来编写API,相对于传统的企图开发方法来说,代码的功率更高,并且完结同样的功能只需求曾经一半的代码量。或许有读者会说,有些项目便是运用曾经的XML+View的方法来开发的,项目比较大,总不能全部用Compose重写一遍吧,这个其实不必担心,因为Compse有良好的兼容性,能够和AndroidView体系的传统代码共存,开发者能够依照自己的节奏去逐步过渡到Compose。这点和Vue.js的规划有点像。

2. 指令式UI和声明式UI的区别

指令式和声明式是两种截然不同的编程范式,指令式运用指令的方法去告知计算机怎么去做事情,计算机通过履行指令得出终究的结果,而声明式式直接告知计算机想要的结果,计算机自己去想该怎么做

Android现在的View视图体系便是指令式编程范式,咱们运用XML界说的布局是静态的,无法更具响应状况自行更新。开发者需求findViewById等获取视图目标,然后通过指令式代码调用目标办法改写UI,而Compose采用的是声明式编程范式,咱们只需求根据UI状况描绘UI,当状况改变时,UI会主动更新。

这时或许会有人说,Data Binding不是能够让XML根据UI状况的改变更新吗?确实是,Data Binding便是Compose诞生之前的一种声明式UI方案,可是感觉用起来还是比较复杂。并且功能不高,因为需求去和XML交互,可是Compose只依赖Kotlin一种言语,避免了因为言语之间的交互带来的功能开支以及安全问题。并且Compose UI的Composable通过Kotlin的尾Lamda语法特性让Composable之间能够嵌套,构成Composeable的树形层级,UI表达能力并不比XML的低

3.Compose API 的规划准则

因为Compose在编程范式和传统视图体系有着底子的不同,所以咱们开始学习它之前,需求对Compose API的规划准则做一个介绍。然后开发的时候应该要严格遵守这些准则,这样代码的可维护性才会更高

3.1 全部组件都是函数

Compose声明式UI的根底是Compose函数,Composeable函数通过多级嵌套构成结构化的函数调用链,函数调用链经过运行后生成一棵UI视图树。

视图树一旦生成便不行随意改变。视图的改写时依靠Composeable函数的反复履行来完结的,当需求显现的数据发生改变时,Composeable函数根据新参数再次履行,更新底层视图树,终究完结视图的改写

JetPack Compose入门知识
在Compose里,全部组件都是函数,不会有承继的层次结构,所有组件都是顶层函数,在Kotlin规范中要求函数名的首字母小写,而在Compose中引荐运用首字母大写,并且不允许有返回值,这样在DSL中书写时可读性更好

3.2 以组合代替承继

在规划模式中咱们都知道,组合优于承继,Android的传统视图体系中的所有组件都是直接或许直接的承继自View类,TextView承继自View,而Button又承继自TextView,这导致了处于末端的View承继了太多无用的功能,所以呈现了“Button上的文字能够仿制”,而Composable作为函数没有承继联系,有利于促进开发者运用组合的视角去思考问题。

Compose的视图树运用组合

JetPack Compose入门知识


传统的View视图树运用的是承继

JetPack Compose入门知识

Compose的组合的方法让组件的责任愈加单一

3.3 单一数据源

单一数据源是包括Compose在内的声明式UI结构中的重要准则,咱们能够回想下EditText,它的文字改变或许式来自用户的输入,也或许式来自代码某处的setText,也便是说状况的改变或许不是一个源,这无形中增加了状况同步的工作量,比方EditText因为自己持有mText状况,所以其他组件需求监听他的状况改变,反之他也或许需求监听其他组件的状况改变,在Compose中运用的是单一数据源,这一点决议了Composeable数据流的单向流动,即数据总是自上而下流动,而事件总是自下而上传递,如图所示:

JetPack Compose入门知识

4.Compose 与View的联系

传统Android View的视图树如下图所示

JetPack Compose入门知识

Compose的视图树如下图

JetPack Compose入门知识

这两种树的节点类型不同,可是他们仍然能够共存于一棵树中,就像DOM节点与AndroidView也不同,可是能够通过WebView显现在一棵树上,Compose也能够借助这样一个衔接点挂载到View树上,而这个衔接点便是ComposeView,ComposeView有一个唯一的子节点AndroidComposeView,它既是一个ViewGroup也是一个LayoutNode视图树的持有者,它完结了LayoutNode与View视图结构的衔接,

CompsoeView承继自AbstractComposeView,AbstractComposeView有三个子类,别离对应Activity的窗口,Dialog窗口与PopWindow窗口,AbstractComposeView的子类担任Android渠道的各类窗口的适配并生成对应的Composition,ComposeView作为一个子类担任Activity窗口适配。总结起来便是:ComposeView担任对Android渠道的Activity窗口的适配,AndroidComposeView担任衔接LayoutNode视图体系与View视图体系

注释:Composition是视图树的创建者,从Composable函数到视图树的生成阅历的过程:第一步是Composeable函数履行后填充SlotTable,SlotTable中记录着Composable履行过程中的状况信息;第二步是根据SlotTable生成和更新LayoutNode视图树,Composition担任从Composable履行到视图树生成(更新)的整个过程

总结

本文主要是介绍了Jetpack Compose是什么以及他和传统Android view的区别,并且还介绍了Compose Api 的规划准则,Compose 只用Kotlin的DSL就完结了UI的编写,不必再去整XML,然后findViewByID了,想想就激动,并且现在的Android主要是用Kotlin开发,听说还要搞跨渠道,字节也宣布后边的重点是Kotlin+Compose的方法,所以Compose 真的值得学。后边就进入实战的环节了,希望能和各位大佬一同交流学习Jetpack ComPose.