背景:
最近有同事在研究公司內(nèi)部的一款跨平臺語言:kuikly 介紹如下: https://shiply.tds.qq.com/docs/doc?id=4012359584
總結(jié)如下:
剛?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 功能已被移除
為了解決這個問題,你可以采用以下兩種方法之一:
- 使用 View Binding:View Binding 是一種更安全、更強大的替代方案,用于在 Kotlin 代碼中訪問視圖。你可以按照上面提到的步驟啟用 ViewBinding,并使用生成的綁定類來訪問視圖。
- 使用 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();
}
重點看下生成代碼的位置
非常簡單:
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ù)布局文件生成對應的代碼,有時候會存在緩存不刷新的問題。另外生成額外的輔助文件,會增加整個包的體積