Intereting Posts
Почему объектам, находящимся внутри объекта сопутствующего объекта Kotlin, не удается получить доступ к «статически», когда другие члены могут? kotlin android – Xposed IllegalArgumentException 'android.content.res.CoollifeUITpedArray' Есть ли чистый DRY способ обновления нескольких текстовых элементов из HTTP-запроса JSON? null или empty lambda в качестве значения по умолчанию Не удается загрузить проект Android Kotlin в бета-версию Fabric с градиентом Могу ли я преобразовать строку в выражение шаблона или выражение лямбда в kotlin? Проблема с защитой класса Kotlin для Android Возможно ли изменить порядок кнопок навигационной панели в android? Связывание с JMM классами, определенными asm из Kotlin с использованием Gradle Может ли компилятор Kotlin оптимизировать функции обертки? Повторение текстуры в области текстуры Ограничения типа класса Generics? Создание класса данных с помощью KotlinPoet TornadoFX – Создание MVP-дизайна Запрос HTTP в Котлине

Замечание типа Observable.combineLatest в kotlin

Я использую RxJava2, Kotlin-1.1 вместе с RxBindings в моем проекте.

У меня есть простой экран входа с отключенной кнопкой входа в систему, я хочу включить кнопку только тогда, когда поля пользователя и пароль не будут пустыми.

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 , но я не понимаю проблему, читая сообщение об ошибке: Вывод типа вывода

Ваша проблема заключается в том, что компилятор не может определить, какое переопределение 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