作为绑定适配器的高阶函数出现问题



>我在尝试使用 Kotlin/Android 数据绑定将函数作为绑定适配器中的参数时遇到问题。此示例代码在生成日志中没有其他有用信息时引发e: error: cannot generate view binders java.lang.StackOverflowError

这是我的绑定适配器:

@JvmStatic
@BindingAdapter("onDelayedClick")
fun onDelayedClick(view: View, function: () -> Unit) {
    // TODO: Do something
}

.XML:

        <View
            android:id="@+id/test_view"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            app:onDelayedClick="@{() -> viewModel.testFunction()}"/>

和我的观点模型中的方法:

fun testFunction() = Unit

我已经为此苦苦挣扎了一段时间,我尝试过的任何方法都不起作用,因此非常感谢任何帮助。

使用 function: Runnable 而不是 function: () -> Unit

Android 的数据绑定编译器生成 java 代码,对于这些代码,您的 kotlin 函数的签名看起来像void testFunction(),因为 kotlin 在从 java 调用时将 Unit 调整为 void。

另一方面,() -> Unit看起来像kotlin.jvm.functions.Function0,它是一个接受 0 个输入并返回 Unit.INSTANCE 的函数。

如您所见,这两个函数签名不匹配,这就是编译失败的原因。

apply plugin: 'kotlin-kapt'放在build.gradle中

然后,您可以创建绑定适配器,例如

@JvmStatic
@BindingAdapter("onDelayedClick")
fun onDelayedClick(view: View, function: () -> Unit) {
    // TODO: Do something
}

和 XML 喜欢

<View
   android:id="@+id/test_view"
   android:layout_width="wrap_content"
   android:layout_height="wrap_content"
   app:onDelayedClick="@{viewModel.testFunction}"/>

和虚拟机喜欢

val testFunction =  {
    // TODO: Do something
}

在事件处理部分,我遇到了这一行:

在侦听

器绑定中,只有返回值必须与侦听器的预期返回值匹配(除非它预期为 void(

有关错误的更多信息:

无法生成视图绑定器 java.lang.StackOverflowError

阅读这篇文章。 希望对您有所帮助!!

声明() -> Unit建议一个不带输入且不返回任何内容的函数(Unit是此语句中的返回类型(。您的函数应如下所示:

fun testFunction() = {}

最新更新