【发布时间】: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。
【问题讨论】:
-
让我知道你最终使用了什么。你也检查过这个:gist.github.com/MariusBudin-zz/9202a25e303a37f240b8。您可以使用 Rxjava 并使字段可观察
标签: android rx-java2 android-databinding android-livedata