简单总结一下,主要有以下几点:
-
废弃了 kotlin-android-extensions 编译插件
-
Parcelable 相关的功能,移到了新的插件 kotlin-parcelize
按照 Google 的解释,kotlin-android-extensions 插件只会保留至少一年的时间,将会在 2021 年 9 月或之后的 Kotlin 版本中将被移除
kotlin-android-extensions 主要有以下两个功能:
-
使用 Kotlin 合成方法(Synthetic 视图)取代 findViewById,通过引入 kotlinx.android.synthetic 可以直接使用控件的 ID,我猜当初也是因为这个特性,吸引了很多开发者开始学习和尝试使用 Kotlin
-
手动实现 Parcelize 比较麻烦,所以 Kotlin 提供了 @Parcelize 注解帮助快速实现 Parcelize
其实这并不是什么新的新闻了,早在 2019 年的时候,Google 就提出了不建议在项目中使用 kotlinx.android.synthetic,详见这个 commit,部分内容如下图所示:
通过引入 kotlinx.android.synthetic 可以直接使用控件的 ID,这么方便为什么不建议使用?主要有以下问题:
-
通过 Kotlin 合成方法(Synthetic 视图)取代 findViewById,这是通过全局空间缓存 ID,与 Layout 无关,没有针对 ID 进行无效检查
-
在不同的 Layout 文件中,使用了相同的 ID,或者删除了 ID ,它并不会提示空异常,导致增加了 App 的崩溃次数
-
仅仅支持 Kotlin
-
默认是通过 HashMap 缓存 ID 浪费空间,虽然可以通过在模块级 build.gradle 文件内添加 defaultCacheImplementation = “SPARSE_ARRAY” 来修改默认的实现方式为 SparseArray
-
…
因此 ViewBinding 出现了,ViewBinding 解决了上述所有问题,ViewBinding 虽然好,但是也有它的不足之处。
-
ViewBinding 相比于 kotlinx.android.synthetic 使用方式比较复杂
-
在 Activity 、 Fragment 、Dialog 、 Adapter 中 ViewBinding 和 DataBinding 初始化方式有些不同
-
需要单独处理 include 带 merge 标签的布局,和不带 merge 标签的布局等等
-
DataBinding 结合 LiveData 一起使用需要做单独的处理
-
…
无论 ViewBinding 和 DataBinding 它们的使用方式都比较复杂,稍后我会介绍一种方法,只需要一行代码即可使用 ViewBinding(视图绑定) 和 DataBinding(数据绑定),那么 ViewBinding 和 Data