web-dev-qa-db-fra.com

Observable.combineDernier type inference in kotlin

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: Type Inference issue

21
blizzard

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

37
zsmb13

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

31
tomoima525