如何通过Android中的数据绑定访问Kotlin Lambda函数

时间:2019-05-02 09:22:35

标签: 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 }
}

我有以下数据绑定表达式

<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变量用于保存存储库中的包装器对象(为简洁起见,将忽略其详细信息)。

现在,当我跑步时,出现此异常

  

[数据绑定] {“ msg”:“在com.fishlee.etc.api.ApiWrapper \ u003ccom.fishlee.auth.Auth,com.fishlee.auth类中找不到方法调用(com.fishlee.auth.Auth) .AuthState \ u003e“

为什么数据绑定无法在包装类中找到方法?

我有一个解决方法,那就是在ViewModel内创建一个方法,然后从那里调用包装器的call方法。但是我真的很想直接从数据绑定表达式中调用它,而这正是ApiWrapper类的重点,如何使用Kotlin通过数据绑定来实现这一点?任何帮助将不胜感激!

1 个答案:

答案 0 :(得分:3)

使用数据绑定库,您仍然牢固地绑定到 Java 世界。在那里,您只能调用方法。但是您的 Kotlin lambda从技术上来说是一个接口,因此只需直接调用invoke方法即可。它不像对对象进行调用那样好,但是比之后定义一个不同的方法要好。

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