jetpack系列之ViewBinding

背景:

最近有同事在研究公司內(nèi)部的一款跨平臺語言:kuikly 介紹如下: https://shiply.tds.qq.com/docs/doc?id=4012359584
總結(jié)如下:

企業(yè)微信截圖_f5913613-3828-4e1b-a0a0-f73b2cf9af67.png

剛?cè)肼殨r用的hippy框架就是對標flutter的,現(xiàn)在這個框架更炸裂,直接用kotlin框架開發(fā),安卓 IOS都直接類似flutter 生成產(chǎn)物 接入到項目 沒有單獨的skia引擎渲染 對安卓開發(fā)很友好 不用去熟悉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,你可以回退到傳統(tǒng)的 findViewById()方法來訪問視圖

kotlin之所以廢棄擴展插件,主要有兩個原因:1.使用時可以導入別的布局中的id直接使用,但是沒有初始化也就是setContentView布局中的資源 直接用會出現(xiàn)空指針 ;如果不同的布局文件用了同名的布局id 導包錯了就涼涼。 2.編譯時生成綁定類 替換反射查找視圖提升性能。

viewbinding使用

首先要在gradle文件中添加開啟的配置

android {
    ...
    buildFeatures {
        viewBinding true
    }
}

使用直接調(diào)用布局文件駝峰寫法拼接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實現(xiàn)。

源碼生成原理

編譯時生成綁定類,View Binding 在更改布局時能夠自動重新生成對應的 XXBinding 類,這主要得益于 Android Gradle 插件的強大功能和 Gradle 構(gòu)建系統(tǒng)的靈活性
比如我們更改某個布局文件名字,不用同步就能直接生成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優(yōu)缺點總結(jié)
優(yōu)點
1.官方推薦

對比kotlin的擴展插件,官方推薦使用 View Binding

2.性能提升

View Binding 在編譯時生成綁定類,相比 Kotlin Android Extensions 使用反射來查找視圖,View Binding 提供了更好的性能。

缺點:
1.布局變化的影響

重構(gòu)時的麻煩:如果布局文件發(fā)生變化(例如 ID 更改),相關的綁定類也會受到影響,可能需要更新多處代碼。

2.不適合動態(tài)視圖

靜態(tài)綁定:View Binding 主要針對靜態(tài)布局,對于需要在代碼中動態(tài)創(chuàng)建視圖的場景,可能不太適用。

3.強依賴gradle版本升級4.x
4.增加APK體積

viewbinding會根據(jù)布局文件生成對應的代碼,有時候會存在緩存不刷新的問題。另外生成額外的輔助文件,會增加整個包的體積

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內(nèi)容