2017-03-10 22 views
9

私はプロジェクトでRxBindingsと共にRxJava2、Kotlin-1.1を使用しています。Observable.combineLatest型推論in kotlin

「ログイン」ボタンがデフォルトで無効になっている簡単なログイン画面がありますが、ユーザー名とパスワードのedittextフィールドが空でない場合にのみボタンを有効にします。

LoginActivity.java

Observable<Boolean> isFormEnabled = 
    Observable.combineLatest(mUserNameObservable, mPasswordObservable, 
     (userName, password) -> userName.length() > 0 && password.length() > 0) 
     .distinctUntilChanged(); 

私はKotlinへJavaから上記のコードを変換することができないよ:

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() }) 
    } 
} 

私はそれが何かを想定第3引数の型推論に関連するものはcombinelatest、bu Type Inference issue

答えて

19

複数のものが彼らの三番目のパラメータとして機能インタフェースを持っているので、あなたの問題は、コンパイラが呼び出すためにcombineLatestのどの上書きを見つけ出すことができないということです:tは私はエラーメッセージを読むことによって、適切に問題を得ることはありません。 SAMコンストラクタで次のように変換を明示的にすることができます。

val isSignInEnabled: Observable<Boolean> = Observable.combineLatest(
     userNameObservable, 
     passwordObservable, 
     BiFunction { u, p -> u.isNotEmpty() && p.isNotEmpty() }) 

Ps。この質問をお寄せいただきありがとうございます、私はこの問題については当初は間違っていたことがわかりました。この解決策でも同様に更新しました。 https://stackoverflow.com/a/42636503/4465208

+0

Observablesを使用するには、私はこれを長い間姿を取り出しました。 – Vicky

9

RxKotlinを使用すると、SAMの曖昧性の問題のヘルパーメソッドを使用できます。

val isSignInEnabled: Observable<Boolean> = Observables.combineLatest(
    userNameObservable, 
    passwordObservable) 
    { u, p -> u.isNotEmpty() && p.isNotEmpty() }) 

あなたが見ることができるように、RxKotlinに代わりObservable

+0

あなたは私の命を救った!ありがとう。 – Johnny