Так что в основном до сих пор я широко использовал rxjava2 в приложениях, но решил проверить привязку данных, просмотреть модели и оперативные данные. И я не уверен, что у меня все это правильно, потому что кроме сохранения состояния во время ротации устройства я не вижу никаких других явных преимуществ переключения, я мог бы даже сказать, что я вижу недостатки введения привязки данных с моделью представления между представлениямии rx Java Powered запросы.
Давайте посмотрим пример какой-то формы регистрации. Он будет содержать:
В реактивном мире у меня будет две наблюдаемые с именем и фамилией, одна наблюдаемая, которая объединит 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
напрямую из xml с помощью bindData, а также я бы изменил состояние своего поля выбора в зависимости от этой привязки, прогресс должен быть сделанвручную, а затем он будет запускать видимость с помощью привязки данных. Но действительно ли это хороший способ обработки таких случаев?
Недостатки, которые я вижу, состоят в том, что вся логика в actionContinue
будет вручную изменять значения, значения из ObservableProperties
могут быть нулевыми, поэтому мы должны обрабатывать значения nullable
везде, где нам нужноиспользуйте !!
и, честно говоря, я не чувствую, что это верное направление.
Может, кто-нибудь из вас подумал о чем-то подобном и в конечном итоге мог бы указать мне, если я сделаю какие-то неправильные предположения или если я не должен 'Например, использовать ObservableProperty
вообще. Очевидно, есть тонны статей о привязке данных, живых данных и т. Д., Но я не нашел ни одной, которая бы удовлетворила мое любопытство. Да, и создавать MutableLiveData
для каждого свойства из формы не вариант.