与使用 Kotlin 和 rx-java combineLatest 的表单验证混淆
Confusion with form validation using Kotlin and rx-java combineLatest
所以我想使用 rx-java2 进行表单验证。我正在使用科特林。我遇到了两个问题。 emailObservable 和 passwordObservable 都是 Disposable!
类型。我试图通过调用 val emailObservable: Observable<Boolean>
来指定类型,但 Android Studio 认为它是 Disposable!
.
其次,当我想使用方法 combineLatest
时出现错误:可以使用提供的参数调用以下函数的 None。
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 })
关于 Disposable
与 Observable
实际上 compiler/IDE 是正确的。 subscribe
方法在 Observable
和 returns 和 Disposable
上调用,也就是说,您可以使用它在 Observable
完成之前取消订阅(有点像"cancel").
然后 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)
}
}
输出:
1 -> 10
1 -> 11
2 -> 11
2 -> 12
2 -> 13
...
所以我想使用 rx-java2 进行表单验证。我正在使用科特林。我遇到了两个问题。 emailObservable 和 passwordObservable 都是 Disposable!
类型。我试图通过调用 val emailObservable: Observable<Boolean>
来指定类型,但 Android Studio 认为它是 Disposable!
.
其次,当我想使用方法 combineLatest
时出现错误:可以使用提供的参数调用以下函数的 None。
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 })
关于 Disposable
与 Observable
实际上 compiler/IDE 是正确的。 subscribe
方法在 Observable
和 returns 和 Disposable
上调用,也就是说,您可以使用它在 Observable
完成之前取消订阅(有点像"cancel").
然后 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)
}
}
输出:
1 -> 10
1 -> 11
2 -> 11
2 -> 12
2 -> 13
...