2017-03-10 29 views
9

Tôi đang sử dụng RxJava2, Kotlin-1.1 cùng với RxBindings trong dự án của tôi.Observable.combineLoại suy luận mới nhất trong kotlin

Tôi có màn hình đăng nhập đơn giản với nút 'đăng nhập' bị tắt theo mặc định, tôi chỉ muốn bật nút khi trường tên người dùng và mật khẩu edittext không trống.

LoginActivity.java

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

Tôi không thể dịch mã trên từ 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() }) 
    } 
} 

tôi cho rằng nó là cái gì liên quan đến suy luận kiểu của đối số thứ ba trong combinelatest, bu t Tôi không nhận được sự cố đúng cách bằng cách đọc thông báo lỗi: Type Inference issue

Trả lời

19

Vấn đề của bạn là trình biên dịch không thể tìm ra ghi đè nào là tham số thứ ba của chúng. Bạn có thể thực hiện chuyển đổi rõ ràng với hàm tạo SAM như sau:

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

Ps. Cảm ơn bạn đã đặt câu hỏi này, nó đã giúp tôi hiểu rằng ban đầu tôi đã sai về vấn đề này, hóa ra là vấn đề tương tự, mà bây giờ tôi đã cập nhật với giải pháp này. https://stackoverflow.com/a/42636503/4465208

+0

Đã cho tôi con số quá lâu này ra. – Vicky

9

Bạn có thể sử dụng RxKotlin cung cấp cho bạn các phương pháp trợ giúp cho vấn đề mơ hồ SAM.

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

Như bạn có thể thấy, trong RxKotlin sử dụng Observables thay vì Observable

+0

Bạn đã cứu mạng tôi! Cảm ơn. – Johnny