如何从 Android 中的数据绑定访问 Kotlin Lambda 函数
How to access Kotlin Lambda functions from databinding in Android
我有以下包装器class
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
变量保存存储库中的包装器对象(为简洁起见忽略细节)。
现在当我 运行 时,我得到这个异常
[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"
为什么数据绑定找不到包装器中的方法class?
我有一个解决方法,即在 ViewModel
中创建一个方法并从那里调用包装器的调用方法。但我真的很想直接从数据绑定表达式调用它,这是 ApiWrapper class 的全部要点,如何使用 Kotlin 通过数据绑定实现这一点?任何帮助将不胜感激!!
使用数据绑定库,您仍然与 Java 世界紧密绑定。在那里你只能调用方法。但是你的 Kotlin lambda 在技术上是一个接口,所以直接调用 invoke
方法就可以了。它不如调用对象好,但比之后定义不同的方法更好。
android:onClick="@{()->vm.login.call.invoke(vm.auth)}"
我有以下包装器class
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
变量保存存储库中的包装器对象(为简洁起见忽略细节)。
现在当我 运行 时,我得到这个异常
[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"
为什么数据绑定找不到包装器中的方法class?
我有一个解决方法,即在 ViewModel
中创建一个方法并从那里调用包装器的调用方法。但我真的很想直接从数据绑定表达式调用它,这是 ApiWrapper class 的全部要点,如何使用 Kotlin 通过数据绑定实现这一点?任何帮助将不胜感激!!
使用数据绑定库,您仍然与 Java 世界紧密绑定。在那里你只能调用方法。但是你的 Kotlin lambda 在技术上是一个接口,所以直接调用 invoke
方法就可以了。它不如调用对象好,但比之后定义不同的方法更好。
android:onClick="@{()->vm.login.call.invoke(vm.auth)}"