我在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
中定义答案 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)
}
}