android - 结合android ViewModel和数据绑定的最佳实践
问题描述
我对如何在android中结合两种技术有点困惑,即
- ViewModel ( https://developer.android.com/topic/libraries/architecture/viewmodel ) 和
- 数据绑定库( https://developer.android.com/topic/libraries/data-binding )
ViewModel应该处理业务逻辑,即实际视图背后的层,并使用 LiveData 之类的东西将数据发送到视图。视图会观察此 LiveData 并根据更改自行更新
数据绑定库的存在是为了更容易绑定到视图并与另一个级别的视图交互(例如通过更新某些类的某些属性)
问题:
- 数据绑定库的属性/模型属性应该保留在ViewModel类(A)中还是视图(活动、片段)中(B)
- If (A) :如果数据绑定库属性/模型保留在 ViewModel 类中,通过更改数据绑定库中的数据在 ViewModel 中执行视图逻辑是否被认为是不好的做法?
- 是否有一个很好的代码示例(一些 GitHub 存储库),其中有一个很好地组合这两个概念的示例?
更新:找到我的问题的官方文档。这是链接: https ://developer.android.com/topic/libraries/data-binding/architecture#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 功能示例。
推荐阅读
- python - 尝试使用 easygui 导出和使用登录信息
- git - 如何正确地将应用程序上传到 GitHub?
- node.js - I can't get react up and running. When i type npm start then it gives me an error
- aws-amplify - 使用 AWS AppSync(带放大),如何允许经过身份验证的用户只读访问,但只允许对象所有者的突变?
- python - ModuleNotFoundError:Jupyter 笔记本中的“sklearn”
- python - Authenticate Azure .cer instead of client secret
- c# - 为什么 Entity Framework Core 试图将记录插入到多对多关系的表之一而不是连接表中?
- html - 错误:模板解析错误:':svg:span' 不是已知元素:
- javascript - 在客户端标准化时间(javascript)
- java - 回收站视图未调用 onBindviewHolder