Как определить, когда EditText пуст, используя RxTextView (RxBinding) - PullRequest
1 голос
/ 10 января 2020

Я делаю проверку на EditText. Я хочу, чтобы CharSequence был недействительным, если он пуст или не начинается с "https: //" . Я также использую RxBinding , в частности RxTextView. Проблема в том, что когда остался один символ, а я затем удаляю его, не оставляя символов в CharSequence, оператор карты не запускает выброс. Другими словами, я хочу, чтобы оператор моей карты возвращал false, когда EditText пуст. Я начинаю думать, что это может быть невозможно, как я это делаю. Что может быть альтернативой?

Вот мой Observable / Disposable:

val systemIdDisposable = RxTextView.textChanges(binding.etSystemId)
            .skipInitialValue()
            .map { charSeq ->
                if (charSeq.isEmpty()) {
                    false
                } else {
                    viewModel.isSystemIdValid(charSeq.toString())
                }
            }
            .subscribe { isValid ->
                if (!isValid) {
                    binding.systemIdTextInputLayout.isErrorEnabled = true
                    binding.systemIdTextInputLayout.error = viewModel.authErrorFields.value?.systemId
                } else {
                    binding.systemIdTextInputLayout.isErrorEnabled = false
                    binding.systemIdTextInputLayout.error = viewModel.authErrorFields.value?.systemId
                }
            }

А вот в моем ViewModel есть функция, которой я передаю CharSequence для проверки:

fun isSystemIdValid(systemId: String?): Boolean {

    return if (systemId != null && systemId.isNotEmpty()) {
        _authErrors.value?.systemId = null 
        true
    } else {
        _authErrors.value?.systemId =
            getApplication<Application>().resources.getString(R.string.field_empty_error)
        false
    }
}

1 Ответ

0 голосов
/ 10 января 2020

После сна я понял это.

Я изменил RxTextView.textChanges на RxTextView.textChangeEvents. Это позволило мне запросить текстовое значение CharSequence (используя метод text(), предоставленный textChangeEvents), даже если оно пустое. Из-за некоторых других изменений (не относящихся к тому, что я задавал в этом вопросе), я также смог уменьшить часть условного кода. Я просто выкладываю это на случай, если кто-то сталкивается с этим и интересуется этими изменениями. Вывод заключается в том, что вы можете получить это пустое излучение, используя RxTextView.textChangeEvents.

Вот мой новый наблюдатель:

 val systemIdDisposable = RxTextView.textChangeEvents(binding.etSystemId)
            .skipInitialValue()
            .map { charSeq -> viewModel.isSystemIdValid(charSeq.text().toString()) }
            .subscribe {
                binding.systemIdTextInputLayout.error = viewModel.authErrors.value?.systemId
            }

А вот мой код проверки из ViewModel:

fun isSystemIdValid(systemId: String?): Boolean {

        val auth = _authErrors.value

        return if (systemId != null && systemId.isNotEmpty()) {
            auth?.systemId = null
            _authErrors.value = auth
            true
        } else {
            auth?.systemId =
                getApplication<Application>().resources.getString(R.string.field_empty_error)
            _authErrors.value = auth
            false
        }
    }

Наконец, если кому-то интересно, как я использую свои объекты LiveData / MutableLiveData; Я создаю частный объект MutableLiveData и открываю только неизменный объект LiveData, который возвращает значения первого объекта. Я делаю это для лучшей инкапсуляции / сокрытия данных. Вот пример:

private val _authErrors: MutableLiveData<AuthErrorFields> by lazy {
        MutableLiveData<AuthErrorFields>()
    }
    val authErrors: LiveData<AuthErrorFields>
        get() { return _authErrors }

Надеюсь, это кому-нибудь поможет! ?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...