J'utilise RxJava2, Kotlin-1.1 avec RxBindings dans mon projet.
J'ai un écran de connexion simple avec le bouton 'login' désactivé par défaut, je veux activer le bouton uniquement lorsque les champs edittext du nom d'utilisateur et du mot de passe ne sont pas vides.
LoginActivity.Java
Observable<Boolean> isFormEnabled =
Observable.combineLatest(mUserNameObservable, mPasswordObservable,
(userName, password) -> userName.length() > 0 && password.length() > 0)
.distinctUntilChanged();
Je ne parviens pas à traduire le code ci-dessus de Java vers 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() })
}
}
J'ai supposé que c'était quelque chose lié à l'inférence de type du troisième argument dans combinelatest
, mais je n'obtenais pas le problème correctement en lisant le message d'erreur:
Votre problème est que le compilateur ne peut pas déterminer quel remplacement de combineLatest
appeler, car plusieurs ont des interfaces fonctionnelles comme troisième paramètre. Vous pouvez rendre la conversion explicite avec un constructeur SAM comme celui-ci:
val isSignInEnabled: Observable<Boolean> = Observable.combineLatest(
userNameObservable,
passwordObservable,
BiFunction { u, p -> u.isNotEmpty() && p.isNotEmpty() })
Ps. Merci d'avoir posé cette question, cela m'a aidé à comprendre que j'avais initialement tort à propos de celui-ci qui se révèle être le même problème, que j'ai également mis à jour avec cette solution. https://stackoverflow.com/a/42636503/4465208
Vous pouvez utiliser RxKotlin qui vous donne des méthodes d'assistance pour le problème d'ambiguïté SAM.
val isSignInEnabled: Observable<Boolean> = Observables.combineLatest(
userNameObservable,
passwordObservable)
{ u, p -> u.isNotEmpty() && p.isNotEmpty() })
Comme vous pouvez le voir, dans RxKotlin, utilisez Observables
au lieu de Observable