Kotlin中的CombineLatest方法具有3个以上Observables:实现该方法时出错

时间:2018-08-08 12:37:22

标签: kotlin rx-java rx-java2

我在Kotlin中使用RxJava CombineLatest方法并具有3个以上Observables。实现该方法时出现错误

val userNameObservable = RxHelper.getTextWatcherObservable(username)
    val passwordObservable = RxHelper.getTextWatcherObservable(password)

    var submitButtonObservable: Observable<String> ?=null
    button.setOnClickListener { submitButtonObservable = RxHelper.getButtonClickable() }

    observable = Observable.combineLatest(userNameObservable, passwordObservable, submitButtonObservable,Triple(userNameObservable,passwordObservable,submitButtonObservable))
    observable?.debounce(800, TimeUnit.MILLISECONDS)?.observeOn(AndroidSchedulers.mainThread())?.subscribe {

        if (username.text.isEmpty() || password.text.isEmpty())
            button.isEnabled = false
        else
            button.isEnabled = true
    }
}

我得到的错误是:

以下任何一个函数都不能使用提供的参数来调用: @CheckReturnValue @SchedulerSupport public final fun CombineLatest(p0:(((Observer)-> Unit)!, p1:((Observer)-> Unit)!, p2:((Observer)-> Unit)!, p3:((? ??,???,???)-> Unit)!):可观察!在io.reactivex.Observable中定义 @CheckReturnValue @SchedulerSupport public open fun CombineLatest(p0:ObservableSource !, p1:ObservableSource !, p2:ObservableSource !, p3:io.reactivex.functions.Function3!):可观察!在io.reactivex.Observable中定义 @CheckReturnValue @SchedulerSupport public open fun CombineLatest(p0:Function !, out Unit!> !, p1:Int,vararg p2:ObservableSource!):可观察!在io.reactivex.Observable

中定义

1 个答案:

答案 0 :(得分:2)

共有三个选项:

使用功能3:

Observable.combineLatest(userNameObservable, passwordObservable, submitButtonObservable, Function3 { username: String, password: String, submitBtn: Any ->
        if (username.text.isEmpty() || password.text.isEmpty())
            button.isEnabled = false
        else
            button.isEnabled = true
    })

使用Observables.combine最新:

    observable = Observables.combineLatest(userNameObservable, passwordObservable, submitButtonObservable)
    observable?.debounce(800, TimeUnit.MILLISECONDS)?.observeOn(AndroidSchedulers.mainThread())?.subscribe {
        //Access data from observables with it.first, it.second and it.third
    }

以其列表形式使用Observable.combineLatest。示例:

Observable.combineLatest(listOf(TextViewObs.create(tietPassword), TextViewObs.create(tietPasswordRepeat))) {
            return@combineLatest it[0]==it[1]
        }.subscribe {
            if(it){
                //Passwords match
                tietPasswordRepeat?.error = null
            }else{
                //Passwords do not match
                tietPasswordRepeat?.error = getString(R.string.Passwords_must_match)
            }
        }