不能在 Kotlin 中使用 BindingAdapter

Can not use BindingAdapter in Kotlin

我曾经创建 DataBindingAdapter 用于在数据绑定中创建自定义 xml 属性。

object DataBindingAdapter {
    @BindingAdapter("android:src")
    fun setImageByRes(imageView: ImageView, @DrawableRes resId: Int) {
        imageView.setImageResource(resId)
    }
}

在Java运作良好但不工作 在 kotlin 中。

据我了解,kotlin 中的对象类似于 Java 的静态方法。但它在数据绑定中不起作用。

java.lang.IllegalStateException: Required DataBindingComponent is null in class FragmentBottomBarBinding. A BindingAdapter in acr.browser.lightning.utils.DataBindingAdapter is not static and requires an object to use, retrieved from the DataBindingComponent. If you don't use an inflation method taking a DataBindingComponent, use DataBindingUtil.setDefaultComponent or make all BindingAdapter methods static.

没有。 kotlin 中的对象与单例相同。我认为你不需要把它放在对象中。只需创建新文件就可以说 BindingAdapters.kt 而你不需要写任何 class 或对象关键字。

它应该是这样的。没有其他的。如果您需要更多功能,只需将其添加到此功能下方即可。同样不需要 class 关键字或括号。这将是全局函数。也许你还应该使用 ContextCompatimageView 的上下文中正确获取 resource。我宁愿以不同于 android:src 的方式命名它。 imageResBinder

怎么样
@BindingAdapter("imageResBinder")
fun setImageByRes(imageView: ImageView, @DrawableRes resId: Int) {
    imageView.setImageResource(resId)
}

然后在您的 .xml 文件中

<android.support.v7.widget.AppCompatImageView
    style="@style/Image.SomeImageStyle"
    app:imageResBinder="@{viewModel.getImageRes()}" />

只需在 setImageByRes 方法上添加 @Jvmstatic 注释。

object DataBindingAdapter {
    @BindingAdapter("android:src")
    @JvmStatic
    fun setImageByRes(imageView: ImageView, @DrawableRes resId: Int) {
        imageView.setImageResource(resId)
    }
}

根据 @Jvmstatic doc

Specifies that an additional static method needs to be generated from this element if it's a function. If this element is a property, additional static getter/setter methods should be generated.

简而言之,在一个地方声明并从 JVM 的多种语言中使用的方法。如果您从 Java 调用一个方法,那么您应该将其声明为 @JvmStatic,因为在一个地方添加 @JvmStatic 注释将允许您在多个地方省略多个 .Companion 引用。