Observable.combine在kotlin中的最新类型推断
我在我的项目中使用了RxJava2,Kotlin-1.1和RxBindings。
我有简单的登录屏幕,默认情况下禁用“登录”按钮,我只想在用户名和密码edittext字段不为空时启用按钮。
LoginActivity.java
Observable<Boolean> isFormEnabled = Observable.combineLatest(mUserNameObservable, mPasswordObservable, (userName, password) -> userName.length() > 0 && password.length() > 0) .distinctUntilChanged();
我无法将上面的代码从Java翻译成Kotlin:
LoginActivity.kt
class LoginActivity : AppCompatActivity() { val disposable = CompositeDisposable() private var userNameObservable: Observable<CharSequence>? = null private var passwordObservable: Observable<CharSequence>? = null override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_login) initialize() } fun initialize() { userNameObservable = RxTextView.textChanges(username).skip(1) .debounce(500, TimeUnit.MILLISECONDS) passwordObservable = RxTextView.textChanges(password).skip(1) .debounce(500, TimeUnit.MILLISECONDS) } private fun setSignInButtonEnableListener() { val isSignInEnabled: Observable<Boolean> = Observable.combineLatest(userNameObservable, passwordObservable, { u: CharSequence, p: CharSequence -> u.isNotEmpty() && p.isNotEmpty() }) } }
我认为这是有关联合最新的第三个参数的类型推断相关的东西,但我没有正确地通过阅读错误消息得到问题:
你的问题是,编译器不能找出combineLatest
调用哪个覆盖,因为多个功能接口作为他们的第三个参数。 你可以使用这样的SAM构造函数来显式地进行转换:
val isSignInEnabled: Observable<Boolean> = Observable.combineLatest( userNameObservable, passwordObservable, BiFunction { u, p -> u.isNotEmpty() && p.isNotEmpty() })
PS。 感谢您提出这个问题,它帮助我弄清楚,我最初是错误的,结果是同样的问题,我现在也更新了这个解决方案。 https://stackoverflow.com/a/42636503/4465208
您可以使用RxKotlin ,它为您提供了SAM模糊问题的辅助方法。
val isSignInEnabled: Observable<Boolean> = Observables.combineLatest( userNameObservable, passwordObservable) { u, p -> u.isNotEmpty() && p.isNotEmpty() })
正如你所看到的,在RxKotlin中使用Observables
而不是Observable