android - 数据绑定视图模型与 RxJava 2
问题描述
所以基本上到目前为止,我一直在应用程序中广泛使用 rxjava2,但决定检查数据绑定、视图模型和实时数据。而且我不确定我是否做对了所有这些,因为除了在设备旋转期间保存状态之外,我看不到切换的任何其他明显好处,我什至可以说我看到在视图之间引入数据绑定与视图模型的缺点和 rx java 驱动的请求。
让我们看看一些注册表单的例子。它将包含:
2 个输入 - 姓名和姓氏
有 3 个选项的字段
带有进度的按钮
在反应式世界中,我将有两个具有姓名和姓氏的可观察对象,一个可观察对象将合并 3 个选择单击并将它们映射到正确的枚举,然后我可以将所有数据组合在一起,直接与我single
负责在两者之间发送数据的人员进行通信我会有进度或错误的状态,然后我完成了。
这是我使用数据绑定和视图模型想到的:
class LiveDataViewModel : ViewModel() {
enum class Choice {
NONE, FIRST, SECOND, THIRD
}
private val _progressVisibilityLiveData = MutableLiveData<Boolean>()
private val _errorLiveData = MutableLiveData<GlobalError>()
val progressVisibilityLiveData: LiveData<Boolean> = _progressVisibilityLiveData.apply { value = false }
val errorLiveData: LiveData<GlobalError> = _errorLiveData
val data = LiveDataData()
val observableData = ObservableField(LiveDataData())
fun actionContinue() {
_progressVisibilityLiveData.postValue(true)
if (observableData.get()?.isValid() == false) _errorLiveData.postValue(GlobalError.AllFieldsRequired)
else sendToApi()
}
private fun sendToApi() {
// TODO there would be still an rx java call to single, when we would handle error in the same way we are doing
// it in actionContinue
}
data class LiveDataData(val firstName: ObservableField<String> = ObservableField(""),
val secondName: ObservableField<String> = ObservableField(""),
val choice: ObservableField<Choice> = ObservableField(Choice.NONE)) {
fun changeChoice(newChoice: Choice) {
choice.set(newChoice)
}
fun isValid(): Boolean = !firstName.get().isNullOrEmpty() && !secondName.get().isNullOrEmpty() && choice.get() != Choice.NONE
fun toRequest(): Request = Request(firstName.get()!!, secondName.get()!!, choice.get()!!)
}
}
因此,我将LiveDataData
使用 bindData 直接从 xml 更改我的字段,我还将根据此绑定更改选择框的状态,必须手动完成进度,然后使用数据绑定触发可见性。但这真的是处理此类案件的好方法吗?
我看到的缺点是整个逻辑actionContinue
将手动更改值,来自的值ObservableProperties
可能为空,所以我们要么必须处理nullable
我们必须使用的任何地方的值,!!
老实说我不觉得这是正确的方向。
也许你们中的任何人都想过类似的事情,如果我做出了一些错误的假设或者我根本不应该使用例如,最终可以指出我ObservableProperty
。显然有大量关于数据绑定和实时数据等的文章,但我还没有找到任何可以满足我好奇心的文章。哦,MutableLiveData
从表单为每个属性创建不是一种选择。
解决方案
RxJava 是一个与 DataBinding 完全不同的概念。它更多的是一种处理并发的方式,而不是绑定数据。我100%认为值得学习。Android 社区已经张开双臂拥抱它。
无耻的插件:我不久前编译了一个 RxJava 资源列表 - http://gregloesch.com/dev/2014/10/20/resources-for-learning-rxjava-android.html
推荐阅读
- python - 如何在 Django 中替换一个模型对象的一个字段?
- java - 如何使用 mockito 模拟 JavaFX 控件?
- discord.py - 打印用户总数
- aws-lambda - NestJS + Serverless / Lambda 上的任务调度 / CRON 作业
- javascript - React 功能组件中超出最大更新深度
- python - 如何制作 Python 打印循环
- blazor - 如何添加 SVG
在 Blazor/razor 文件中 - python - 抓取长度为 6 的数字,Python 中特定短语后面的数字除外
- php - 从 WooCommerce 中的管理产品设置和单个产品页面中删除“重量”
- python - Python中是否有一种方法可以从字符串中读取两个浮点数