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

3

我对如何在安卓中组合两种技术感到有些困惑,它们分别是:

ViewModel 应该处理业务逻辑,位于实际视图后面的层,并使用 LiveData 之类的东西向视图发送数据。视图观察这个 LiveData 并在更改时更新自己。

Data Binding Library 存在的目的是更容易地绑定到视图并在另一层面上与视图交互(例如通过更新某个类的某些属性)。

问题:

  • 应该将 Data Binding Library 的属性 / 模型属性保留在 ViewModel 类内部 (A) 还是在视图(activity、fragment)内部 (B)?
  • 如果 (A):如果 Data Binding Library 属性 / 模型保存在 ViewModel 类中,那么从数据绑定库更改数据执行视图逻辑是否被认为是不良实践?
  • 是否有一个好的代码示例(一些 GitHub 存储库)演示了这两个概念的相当组合?

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

1个回答

3

数据绑定的工作原理

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

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

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

因此,答案为 (A):

您可以拥有一个类型为 LiveData<T> 的属性的 ViewModel 类,并且可以直接从您的 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功能示例的有用存储库。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接