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

时间:2019-11-04 20:47:21

标签: android kotlin android-databinding android-jetpack android-viewmodel

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

ViewModel 应该处理业务逻辑,即实际视图背后的层,并使用LiveData之类的数据将数据发送到视图。视图会观察此LiveData并根据更改进行更新

数据绑定库的存在是为了更轻松地绑定到视图并在另一个级别上与视图交互(例如,通过更新某些类的某些属性)

问题:

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

更新:找到了我的问题的官方文档。链接在这里: https://developer.android.com/topic/libraries/data-binding/architecture#viewmodel

1 个答案:

答案 0 :(得分:1)

数据绑定的工作方式

考虑使用LiveData,它位于ViewModel内,并且是数据绑定库知道必须更新的字符串,例如TextView的字符串。

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

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

所以答案是(A):

您可以拥有一个ViewModel类,其属性类型为LiveData<T>,并且可以从Layout中直接使用它们,而无需像我前面提到的那样明确地从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"
    }
}

布局:

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

资源

Google Codelab非常有用,当我开始进行数据绑定时,它可以帮助我,这对我很有帮助。

如果您只想直接编写代码,android/sunflower是一个使用数据绑定的存储库,通常提供有用的jetpack功能示例。