背景:
最近有同事在研究公司内部的一款跨平台语言:kuikly 介绍如下: https://shiply.tds.qq.com/docs/doc?id=4012359584
总结如下:
刚入职时用的hippy框架就是对标flutter的,现在这个框架更炸裂,直接用kotlin框架开发,安卓 IOS都直接类似flutter 生成产物 接入到项目 没有单独的skia引擎渲染 对安卓开发很友好 不用去熟悉dart
需要升级 Kotlin 版本后遇到了"Unresolved reference: synthetic" 的错误提示
这是因为在 Kotlin 1.4.20版本及之后,kotlin-android-extensions,插件中的 synthetic properties 功能已被移除
为了解决这个问题,你可以采用以下两种方法之一:
- 使用 View Binding:View Binding 是一种更安全、更强大的替代方案,用于在 Kotlin 代码中访问视图。你可以按照上面提到的步骤启用 ViewBinding,并使用生成的绑定类来访问视图。
- 使用 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();
}
重点看下生成代码的位置
非常简单:
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会根据布局文件生成对应的代码,有时候会存在缓存不刷新的问题。另外生成额外的辅助文件,会增加整个包的体积