jetpack系列之ViewBinding

背景:

最近有同事在研究公司内部的一款跨平台语言:kuikly 介绍如下: https://shiply.tds.qq.com/docs/doc?id=4012359584
总结如下:

企业微信截图_f5913613-3828-4e1b-a0a0-f73b2cf9af67.png

刚入职时用的hippy框架就是对标flutter的,现在这个框架更炸裂,直接用kotlin框架开发,安卓 IOS都直接类似flutter 生成产物 接入到项目 没有单独的skia引擎渲染 对安卓开发很友好 不用去熟悉dart
需要升级 Kotlin 版本后遇到了"Unresolved reference: synthetic" 的错误提示
这是因为在 Kotlin 1.4.20版本及之后,kotlin-android-extensions,插件中的 synthetic properties 功能已被移除

为了解决这个问题,你可以采用以下两种方法之一:

  1. 使用 View Binding:View Binding 是一种更安全、更强大的替代方案,用于在 Kotlin 代码中访问视图。你可以按照上面提到的步骤启用 ViewBinding,并使用生成的绑定类来访问视图。
  2. 使用 findViewByld():如果你不想使用 View Binding,你可以回退到传统的 findViewById()方法来访问视图

kotlin之所以废弃扩展插件,主要有两个原因:1.使用时可以导入别的布局中的id直接使用,但是没有初始化也就是setContentView布局中的资源 直接用会出现空指针 ;如果不同的布局文件用了同名的布局id 导包错了就凉凉。 2.编译时生成绑定类 替换反射查找视图提升性能。

viewbinding使用

首先要在gradle文件中添加开启的配置

android {
    ...
    buildFeatures {
        viewBinding true
    }
}

使用直接调用布局文件驼峰写法拼接Binding直接获取, 布局名字activity_mainddddd.xml

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)

        // 绑定机制的缺点
        /*setContentView(R.layout.activity_main)
        */
        val inflate = ActivityMaindddddBinding.inflate(layoutInflater)
        inflate.tv1.text = "AAA"
        inflate.tv2.text = "BBB"
    }

ActivityMaindddddBinding生成主要依赖gradle实现。

源码生成原理

编译时生成绑定类,View Binding 在更改布局时能够自动重新生成对应的 XXBinding 类,这主要得益于 Android Gradle 插件的强大功能和 Gradle 构建系统的灵活性
比如我们更改某个布局文件名字,不用同步就能直接生成XXBinding类,就跟我们更改布局里面加一个id,在activity中可以直接使用
首先viewBinding就是一个接口 提供一个getroost方法:

public interface ViewBinding {
    /**
     * Returns the outermost {@link View} in the associated layout file. If this binding is for a
     * {@code <merge>} layout, this will return the first view inside of the merge tag.
     */
    @NonNull
    View getRoot();
}

重点看下生成代码的位置


image.png

非常简单:


image.png
viewbinding优缺点总结
优点
1.官方推荐

对比kotlin的扩展插件,官方推荐使用 View Binding

2.性能提升

View Binding 在编译时生成绑定类,相比 Kotlin Android Extensions 使用反射来查找视图,View Binding 提供了更好的性能。

缺点:
1.布局变化的影响

重构时的麻烦:如果布局文件发生变化(例如 ID 更改),相关的绑定类也会受到影响,可能需要更新多处代码。

2.不适合动态视图

静态绑定:View Binding 主要针对静态布局,对于需要在代码中动态创建视图的场景,可能不太适用。

3.强依赖gradle版本升级4.x
4.增加APK体积

viewbinding会根据布局文件生成对应的代码,有时候会存在缓存不刷新的问题。另外生成额外的辅助文件,会增加整个包的体积

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容