结合android ViewModel和数据绑定的最佳实践

结合android ViewModel和数据绑定的最佳实践,android,kotlin,android-databinding,android-jetpack,android-viewmodel,Android,Kotlin,Android Databinding,Android Jetpack,Android Viewmodel,我对如何在android中结合两种技术感到有点困惑,即 视图模型()和 数据绑定库() ViewModel应该处理业务逻辑,即实际视图后面的层,并使用LiveData之类的东西将数据发送到视图。视图观察此LiveData并在更改时更新自身 数据绑定库的存在使得绑定到视图以及在另一个级别上与视图交互更加容易(例如,通过更新某个类的某些属性) 问题是: 数据绑定库的属性/模型属性是否应保存在视图模型类(A)或视图(活动、片段)(B)中 If(A):如果数据绑定库属性/模型保存在ViewMode

我对如何在android中结合两种技术感到有点困惑,即

  • 视图模型()和
  • 数据绑定库()
ViewModel应该处理业务逻辑,即实际视图后面的层,并使用LiveData之类的东西将数据发送到视图。视图观察此LiveData并在更改时更新自身

数据绑定库的存在使得绑定到视图以及在另一个级别上与视图交互更加容易(例如,通过更新某个类的某些属性)

问题是:

  • 数据绑定库的属性/模型属性是否应保存在视图模型类(A)或视图(活动、片段)(B)中
  • If(A):如果数据绑定库属性/模型保存在ViewModel类中,通过更改数据绑定库中的数据在ViewModel内部执行视图逻辑是否被视为不良做法
  • 是否有一个很好的代码示例(一些GitHub repo),其中有这两个概念的合理组合的示例

更新:找到我的问题的官方文档。以下是链接:

数据绑定的工作原理

考虑使用
LiveData
,它位于
ViewModel
中,数据绑定库知道您必须更新
TextView
的字符串

数据绑定的实际作用类似于您在片段中显式执行的操作:

从Kotlin代码(
Fragment/Activity
)订阅
LiveData
属性,该属性位于
ViewModel
中,但在这种情况下,数据绑定将为您更新视图值,因为您将在XML布局中指示它

因此答案是(A):

您可以拥有一个
ViewModel
类,其属性类型为
LiveData
,从布局中,您可以直接使用它们,而无需像我前面提到的那样从kotlin代码中明确订阅,这将继续保证ViewModel继续作为用户视图的信息提供者,不同之处在于,数据绑定将代替显式地执行此操作。

class MyViewModel : ViewModel {
    // view model doesn't know if Fragment/Activity is using data binding or not, it just continues providing info as normal.
    val myString : MutableLiveData<String> = MutableLiveData()

    init {
        myString.value = "a value that data binding will print in a TextView for you"
    }

    private fun changeMyString() {
        // Change the value in the future when you want and then data binding will print the text in your TextView for you.
        myString.value = "other value to that TextView"
    }
}
类MyViewModel:ViewModel{
//视图模型不知道片段/活动是否正在使用数据绑定,它只是继续正常地提供信息。
val myString:MutableLiveData=MutableLiveData()
初始化{
myString.value=“数据绑定将在TextView中为您打印的值”
}
private fun changeMyString(){
//在将来需要时更改该值,然后数据绑定将在TextView中为您打印文本。
myString.value=“该文本视图的其他值”
}
}
布局:

<TextView
    android:text="@{myViewModel.myString}" />

资源

这是非常有用的,当我开始使用数据绑定时,它帮助了我,因为它准备教我

如果您只想直接访问代码,那么这是一个使用数据绑定的存储库,通常提供jetpack功能的有用示例