【问题标题】:DataBinding ViewModel vs RxJava 2数据绑定视图模型与 RxJava 2
【发布时间】:2019-10-25 12:09:00
【问题描述】:

所以到目前为止,我基本上一直在应用程序中广泛使用 rxjava2,但决定检查数据绑定、查看模型和实时数据。而且我不确定我是否做对了所有这些,因为除了在设备旋转期间保存状态之外,我看不到切换的任何其他明显好处,我什至可以说我看到在视图之间引入数据绑定与视图模型的缺点和 rx java 驱动的请求。

让我们看看一些注册表单的例子。它将包含:

  • 2 个输入 - 姓名和姓氏

  • 有 3 个选项的字段

  • 进度按钮

在响应式世界中,我将有两个带有姓名和姓氏的 observable,一个 observable 将合并 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()!!)
    }
}

所以我会使用 bindData 直接从 xml 更改我的 LiveDataData 的字段,我也会根据此绑定更改我的选择框的状态,必须手动完成进度,然后它会触发使用数据的可见性捆绑。但这真的是处理此类案件的好方法吗?

我看到的缺点是actionContinue 中的整个逻辑将手动更改值,ObservableProperties 中的值可能为空,所以我们要么必须处理 nullable 的值,要么必须使用 @987654328 @老实说,我不觉得这是正确的方向。

也许你们中的任何人都想过类似的事情,如果我做出了一些错误的假设或者我根本不应该使用 ObservableProperty,最终可能会指出我。显然有大量关于数据绑定和实时数据等的文章,但我还没有找到任何可以满足我好奇心的文章。哦,不要为表单中的每个属性创建MutableLiveData

【问题讨论】:

标签: android rx-java2 android-databinding android-livedata


【解决方案1】:

RxJava 是一个与 DataBinding 完全不同的概念。它更多的是一种处理并发的方式,而不是绑定数据。我100%认为值得学习。 Android 社​​区已经张开双臂拥抱它。

无耻插件:不久前我编译了一个 RxJava 资源列表 - http://gregloesch.com/dev/2014/10/20/resources-for-learning-rxjava-android.html

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-06-20
    • 2021-11-07
    • 2013-09-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-10-25
    相关资源
    最近更新 更多