新的ViewBinding与带有合成视图绑定的Kotlin Android扩展相比如何?
除了新ViewBindings提供的NullSafety和TypeSafety之外,我们为什么还要考虑放弃在Views上使用合成绑定的Kotlin方法。
由于新的ViewBinding事先生成了Binding类,因此它的性能更高吗?
让我们回顾两个。
导入适当的布局合成扩展名: import kotlinx.android.synthetic.main.
通过ID引用代码中的视图textView.text = "Hello, world!"
。这些扩展的工作:Activities
,Fragments
和Views
。
在类中创建绑定引用: private lateinit var binding
YourClassBinding
虚增您结合binding = YourClassBinding.inflate(layoutInflater)
内部Activity
的onCreate
和呼叫setContentView(binding.root)
,或夸大它Fragment
的onCreateView
,然后返回它:return binding.root
通过使用其ID进行绑定的代码引用视图 binding.textView.text = "Hello, world!"
根据定义,Kotlin Android扩展和ViewBinding是类型安全的,因为已将引用的视图强制转换为适当的类型。
Kotlin Android扩展和ViewBinding都是null安全的。ViewBinding在这里没有任何优势。对于KAE,如果视图仅在某些布局配置中存在,IDE会为您指出:
因此,您只需将其与Kotlin中的其他任何可为null的类型一样对待,错误就会消失:
如果是Kotlin Android扩展,布局更改会立即转换为合成扩展的生成,因此您可以立即使用它们。如果使用ViewBinding,则必须构建您的项目
如果是Kotlin Android扩展程序,则可能会导入不正确的布局合成扩展程序,从而导致NullPointerException
。这同样适用于ViewBinding,因为我们可以导入错误的Binding
类。虽然,比不正确的类名更容易忽略不正确的导入,尤其是在布局文件以Activity
/ Fragment
/ 命名之后View
,因此ViewBinding在这里占了上风。
输入安全 -抽奖。
空安全 -抽奖。
样板代码 - KAE胜。从Kotlin Android扩展文档:
Kotlin Android扩展插件使我们能够获得与其中某些库相同的体验,而无需添加任何额外的代码。
应用布局的变化 - KAE获胜。与ViewBinding相比,更改是即时的。
不正确使用的布局 - ViewBinding胜
我认为将ViewBinding替换为KAE有很大的误解。人们会听到较大的关键字,并在没有事先验证的情况下重复它们。可以肯定的是,ViewBinding现在是Java开发的最佳选择(替换ButterKnife),但是在Kotlin中与KAE相比没有优势或几乎没有优势(请参阅不正确的布局用法部分)。
旁注: 我确定DataBinding的人会喜欢ViewBinding的:)