使用Kotlin和rx-java combineLatest与表单验证混淆

daw*_*zaw 0 kotlin rx-java rx-android rx-binding rx-java2

所以我想用rx-java2进行表单验证.我正在使用Kotlin.我遇到了两个问题.emailObservable和passwordObservable都是类型Disposable!.我尝试通过调用指定类型,val emailObservable: Observable<Boolean>但Android Studio认为它Disposable!.

其次,当我想使用方法时combineLatest出现错误:使用提供的参数不能调用以下任何函数.

emailObservable和passwordObservable都能正常工作.我是rx-java的新手,我对这种类型的东西很困惑.

val emailObservable = RxTextView.afterTextChangeEvents(textEmail)
                .observeOn(AndroidSchedulers.mainThread())
                .map { x -> textEmail.text.length > 3 }
                .subscribe { x -> foo(x) }

val passwordObservable =RxTextView.afterTextChangeEvents(textPassword)
                .observeOn(AndroidSchedulers.mainThread())
                .map { x -> textPassword.text.length > 5 }
                .subscribe { x -> foo(x) }


Observable.combineLatest(emailObservable,
passwordObservable,
BiFunction { x: Boolean, y:Boolean -> x && y })
Run Code Online (Sandbox Code Playgroud)

use*_*612 5

关于Disposablevs Observable实际上编译器/ IDE是正确的.该subscribe方法在Observablea 上调用并返回a Disposable,即可以用来取消订阅Observable之前的东西(取消"取消").

然后该combineLatest方法需要以2 Observable秒调用,而您需要提供2 Disposable秒.要解决这个问题,你不应该subscribe直接在链中调用,而应该在结果上调用combineLatest.

例:

fun main(args: Array<String>) {
    val first = Observable.intervalRange(1, 10, 0, 2, TimeUnit.SECONDS)
    val second = Observable.intervalRange(10, 20, 0, 1, TimeUnit.SECONDS)

    Observable.combineLatest(arrayOf(first, second)) {
        "${it[0]} -> ${it[1]}"
    }.blockingSubscribe() {
        println(it)
    }
}
Run Code Online (Sandbox Code Playgroud)

输出:

1 -> 10
1 -> 11
2 -> 11
2 -> 12
2 -> 13
...
Run Code Online (Sandbox Code Playgroud)