【发布时间】:2020-03-27 05:14:43
【问题描述】:
我有一个订阅表单:姓名、地址、本地等等……我希望能够使用Data Binding、LiveData 和SavedStateHandle 来处理和保存数据。
假设:1 路 Data Binding、LiveData 和 SavedStateHandle
private val _name: MutableLiveData<Boolean> = stateHandle.getLiveData("_name", "")
val name: LiveData<String> = _name
fun onNameChanged(editable: Editable) {
_name.value = editable.toString()
}
<EditText
android:text="@{viewModel.name}"
android:afterTextChanged="@{viewModel::onNameChanged}"
...
/>
这可行,但我认为我们可以做得更好:
-
@Parcelize class Form封装所有字段 -
2-way Data Binding减少.xml代码
现在问题开始出现了。
如何通知我Form class 内部的更改,以便能够将object 与SavedState 保持一致?尝试改进上面的代码或使用2-way Data Binding 我们失去控制实际上有优势吗?我还使用一些逻辑来启用这样的提交按钮:
private val _name: MutableLiveData<String> = stateHandle.getLiveData("_name", "")
val name = _name.map { value -> {
updateUi()
return value}
}
private val _formValidLiveData = MutableLiveData<Unit>()
val submitEnable = _formValidLiveData.map { _ -> isFormValid() }
val submitAlpha = _formValidLiveData.map { _ -> if (isFormValid()) 1f else 0.5f }
...
private fun updateUi() {
_formValidLiveData.value = Unit
}
同样,2-way Data Binding 我失去了控制,当EditText 字段更改时,我如何调用updateUi()?
感谢您的宝贵时间。
【问题讨论】:
-
如果你想使用双向绑定,为什么不使用
public val name: MutableLiveData<Boolean>? -
@EpicPandaForce,实际上这是一个好点,我完全错过了。但是现在我怎样才能对那个 MutableLiveData 应用一个转换呢?因为我想为 UX 目的执行 updateUi(),所以每次字段更改时。问题 2:我怎样才能拥有一个能够使用 SavedState 存储的数据类(或类),并且它的字段是双向绑定的?
-
啊,这很棘手,您可以定义一个私有 MediatorLiveData 来触发始终观察此 MutableLiveData 的内部更改。
-
你为什么不直接
stateHandle.set(KEY, VALUE)而不必关心MutableLiveData
标签: android android-databinding android-architecture-components 2-way-object-databinding viewmodel-savedstate