Привязка данных ViewModel против RxJava 2 - PullRequest
1 голос
/ 25 октября 2019

Так что в основном до сих пор я широко использовал rxjava2 в приложениях, но решил проверить привязку данных, просмотреть модели и оперативные данные. И я не уверен, что у меня все это правильно, потому что кроме сохранения состояния во время ротации устройства я не вижу никаких других явных преимуществ переключения, я мог бы даже сказать, что я вижу недостатки введения привязки данных с моделью представления между представлениямии rx Java Powered запросы.

Давайте посмотрим пример какой-то формы регистрации. Он будет содержать:

  • 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 напрямую из xml с помощью bindData, а также я бы изменил состояние своего поля выбора в зависимости от этой привязки, прогресс должен быть сделанвручную, а затем он будет запускать видимость с помощью привязки данных. Но действительно ли это хороший способ обработки таких случаев?

Недостатки, которые я вижу, состоят в том, что вся логика в actionContinue будет вручную изменять значения, значения из ObservableProperties могут быть нулевыми, поэтому мы должны обрабатывать значения nullable везде, где нам нужноиспользуйте !! и, честно говоря, я не чувствую, что это верное направление.

Может, кто-нибудь из вас подумал о чем-то подобном и в конечном итоге мог бы указать мне, если я сделаю какие-то неправильные предположения или если я не должен 'Например, использовать ObservableProperty вообще. Очевидно, есть тонны статей о привязке данных, живых данных и т. Д., Но я не нашел ни одной, которая бы удовлетворила мое любопытство. Да, и создавать MutableLiveData для каждого свойства из формы не вариант.

1 Ответ

0 голосов
/ 14 ноября 2019

RxJava - это совершенно другая концепция, чем DataBinding. Это больше способ обработки параллелизма, чем привязки данных. Я на 100% думаю, что стоит учиться. Сообщество Android приняло его с распростертыми объятиями.

Бесстыдный плагин: я недавно собрал список ресурсов RxJava - http://gregloesch.com/dev/2014/10/20/resources-for-learning-rxjava-android.html

...