android - 如何从 Android 中的数据绑定(bind)访问 Kotlin Lambda 函数

标签 android kotlin lambda data-binding invoke

我有以下包装类

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

我有以下数据绑定(bind)表达式

<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"/>
ViewModel 中的

login 变量保存存储库中的包装器对象(为简洁起见忽略细节)。

现在当我运行时,我得到这个异常

[databinding] {"msg":"cannot find method call(com.fishlee.auth.Auth) in class com.fishlee.etc.api.ApiWrapper\u003ccom.fishlee.auth.Auth,com.fishlee.auth.AuthState\u003e"

为什么数据绑定(bind)找不到包装类中的方法?

我有一个解决方法,即在 ViewModel 中创建一个方法并从那里调用包装器的调用方法。但我真的很想直接从数据绑定(bind)表达式调用它,这是 ApiWrapper 类的全部要点,如何使用 Kotlin 通过数据绑定(bind)实现这一点?任何帮助将不胜感激!!

最佳答案

使用数据绑定(bind)库,您仍然强烈地绑定(bind)到 Java 世界。在那里你只能调用方法。但是你的 Kotlin lambda 在技术上是一个接口(interface),所以直接调用 invoke 方法即可。这不如调用对象好,但比之后定义不同的方法要好。

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

关于android - 如何从 Android 中的数据绑定(bind)访问 Kotlin Lambda 函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55949324/

相关文章:

android:layout_weight 在 Xamarin 中不起作用

java - Android:具有多个元素的Arraylist

intellij-idea - 如何在 Kotlin 代码中使用 IntelliJ "Extract Parameter Object"?

android - ROOM 构造函数在构建时无法匹配

kotlin - 如何使用名称中带有冒号的 json 元素的类数据 - Kotlin

java - 在 lambda 表达式中转换函数接口(interface)的上下文

android - 如何开发android SMS View?

android - 将位图上传到 Ruby Rails 服务器

java - 如何通过使用collections.sort使用trim避免NPE?

从方法参数中捕获 Java 8 lambda 可变变量?