Как получить доступ к функциям Kotlin Lambda из базы данных в Android - PullRequest
1 голос
/ 02 мая 2019

У меня следующий класс Wrapper

class ApiWrapper<I, O>(
    val response: LiveData<Resource<O>>,
    val call: (I?) -> Unit
) {
    val loading = map(response) { it.status == RequestState.LOADING }
}

И у меня есть следующее выражение для привязки данных

<com.google.android.material.button.MaterialButton
            android:id="@+id/signInBtn"
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:enabled="@{!vm.login.loading}"
            android:onClick="@{()->vm.login.call(vm.auth)}"
            android:text="@string/sign_in"
            app:layout_constraintEnd_toEndOf="parent"
            app:layout_constraintStart_toStartOf="parent"/>

login переменная во ViewModel содержит объект-оболочку из хранилища (игнорируя детали для краткости).

Теперь, когда я бегу, я получаю это исключение

[привязка данных] {"msg": "не удается найти вызов метода (com.fishlee.auth.Auth) в классе com.fishlee.etc.api.ApiWrapper \ u003ccom.fishlee.auth.Auth, com.fishlee.auth .AuthState \ u003e "

Почему привязка данных не может найти метод в классе оболочки?

У меня есть обходной путь, который заключается в создании метода внутри ViewModel и вызове метода вызова упаковщика оттуда. Но мне бы очень хотелось вызывать его напрямую из выражения привязки данных, в чем и заключался весь смысл класса ApiWrapper. Как мне добиться этого с привязкой данных с помощью Kotlin? Любая помощь будет принята с благодарностью !!

1 Ответ

3 голосов
/ 02 мая 2019

С библиотекой привязки данных вы все еще сильно привязаны к миру Java .Там вы можете только вызывать методы.Но ваша Kotlin лямбда технически является интерфейсом, поэтому просто вызовите метод invoke напрямую.Это не так приятно, как вызов объекта, но лучше, чем определить другой метод после этого.

android:onClick="@{()->vm.login.call.invoke(vm.auth)}"
...