首页 > 解决方案 > 结合android ViewModel和数据绑定的最佳实践

问题描述

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

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

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

问题:


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

标签: androidkotlinandroid-databindingandroid-jetpackandroid-viewmodel

解决方案


数据绑定的工作原理

考虑使用LiveData,它存在于 中,ViewModel并且数据绑定库如何知道您必须更新例如 a 的字符串TextView

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

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

所以答案是(A):

您可以拥有一个ViewModel具有类型属性LiveData<T>和布局的类,您可以直接使用它们,而无需像我之前提到的那样从您的 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 功能示例。


推荐阅读