如果电子邮件和密码不为空,则使用 Rxjava 更改按钮的可见性

Change Visibility of a button if Email & password is not empty using Rxjava

当电子邮件和密码 TextInputEditText 用于登录功能时,我想验证登录屏幕中的表单。我使用具有相应逻辑的 ObservableEmailText 和 ObservablePasswordText。为此,我使用扩展函数

Extensions.kt

fun TextInputEditText.checkError(textInputLayout: TextInputLayout, errorMessage: String, isValid: (String)->Boolean): Observable<String> {
    return textChanges()
        .map { it.toString() }
        .doOnNext {
            if (it.isNotEmpty()) {
                textInputLayout.error = if (isValid(it)) null else errorMessage
            }
    }
}

MainActivity.kt

private val emailObservable
        get() = email_edit_text.checkError(email_input_layout, "Invalid Email") {
            viewModel.isEmailValid(it)
        }

private val phoneNumberObservable
        get() = password_edit_text.checkError(password_input_layout, "Invalid Password") {
            viewModel.isPasswordValid(it)
        }

override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(getLayoutResource())

        compositeDisposable += Observable.combineLatest<String, String, Boolean>(
            emailObservable,
            phoneNumberObservable,
            BiFunction { t1, t2 -> viewModel.isEmailValid(t1) && viewModel.isPasswordValid(t2) }
        ).subscribe({
            if (it) login_button.visibility = View.VISIBLE
        }, {})
}

我遇到的问题是,第一次没有完成Email和password的逻辑,按钮一直隐藏。但是当我完成电子邮件和密码的逻辑时,它就变得可见了。没事。其实我也想要那个。但问题是当我清除文本或做一些不符合从 TextViews 获取价值的逻辑的文本时,它仍然可见。我该如何解决这个问题

那是因为一旦您使按钮可见,View.VISIBLE 逻辑一完成。但是如果之后有变化,你就再也不会隐藏它了。

所以基本上你在你的订阅部分缺少一个 else 块

compositeDisposable += Observable.combineLatest<String, String, Boolean>(
            emailObservable,
            phoneNumberObservable,
            BiFunction { t1, t2 -> viewModel.isEmailValid(t1) && viewModel.isPasswordValid(t2) }
        ).subscribe({
            if (it) login_button.visibility = View.VISIBLE
            else login_button.visibility = View.GONE // This line is missing
        }, {})