android - 如何在 Android 中通过数据绑定访问 Kotlin Lambda 函数
问题描述
我有以下包装类
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.etc.api.ApiWrapper\u003ccom.fishlee.auth.Auth,com.fishlee.auth.AuthState\ 类中找不到方法调用(com.fishlee.auth.Auth) u003e"
为什么数据绑定在包装类中找不到方法?
我有一个解决方法,即在内部创建一个方法ViewModel
并从那里调用包装器的调用方法。但我真的很想直接从数据绑定表达式中调用它,这是 ApiWrapper 类的重点,如何使用 Kotlin 进行数据绑定?任何帮助将不胜感激!
解决方案
使用数据绑定库,您仍然与Java世界紧密相连。在那里你只能调用方法。但是您的Kotlin lambda 在技术上是一个接口,因此只需invoke
直接调用该方法即可。它不如调用对象好,但比此后定义不同的方法要好。
android:onClick="@{()->vm.login.call.invoke(vm.auth)}"
推荐阅读
- java - POJO类如何实现继承
- google-apps-script - gmail 插件中的事件或操作
- java - 如何使用 selenium webdriver 在 Safari 中处理地理位置弹出窗口?
- powershell - 通过 Powershell 在线打开 Sharepoint 上的文件并将数据附加到该文件并将其保存回 sharepoint
- memory-leaks - 添加到UIWindow后如何销毁VC?
- python - Pygame 和键盘模块组合,True 循环突然中断
- javascript - 卸载本地软件包时可能导致持续错误的原因是什么?
- mongodb - 找出运行给定 MongoDB 命令所需的权限
- verilog - 如何实现溢出代码?我不知道怎么了
- angular - 自 Angular 8 更新以来,无法导入 Angular 材质的特定入口点