我已经看到一些使用MVVM
表达式来处理事件的Android databinding
示例,例如单击按钮。然后,有界的ViewModel
方法将运行逻辑并张贴在LiveData
对象上,该对象将通过片段观察该对象,例如进行导航。
Fragment.kt
viewModel.buttonClicked.observe(this, Observer {
findNavController().navigate(action)
})
fragment.xml
<Button
android:id="@+id/button_id"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:onClick="@{(view) -> viewModel.onButtonClicked()}"
android:text="Button" />
ViewModel.kt
val buttonClicked = MutableLiveData<Unit>()
fun onButtonClicked() {
// do some logic here
buttonClicked.postValue(Unit)
}
所以我想知道是否仅通过使用onClickListener
在按钮上注册kotlin-android-extensions
就有什么明显的区别。
Fragment.kt
button_id.setOnClickListener {
viewModel.doSomething()
findNavController().navigate(action)
}
ViewModel.kt
fun doSomething() {
// do some logic here
}
我知道第一个解决方案是事件驱动的,因此完全是异步的,在这些示例的大多数情况下,这是不需要的,因为最后一行代码总是发布在buttonClicked
LiveData上。
据我了解,第二种方法也是MVVMish,所以我想知道这两种解决方案之间的真正区别是什么?