После сна я понял это.
Я изменил 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 }
Надеюсь, это кому-нибудь поможет! ?