androidkotlinandroid-databinding

Can not use BindingAdapter in Kotlin


I used to create DataBindingAdapter for creating custom xml attributes in data binding.

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

It was working well in Java. But not working in kotlin.

As I understand object in kotlin are similer to static method of Java. But its not working in data binding.

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.


Solution

  • Just add the @Jvmstatic annotation on setImageByRes method.

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

    as per the @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.

    In short method declared in one place and used from multiple languages of JVM. If you're calling a method from Java, then you should declare it as @JvmStatic, because adding the @JvmStatic annotation in one place will allow you to leave out multiple .Companion references in multiple places.