Подтвердить что ты не робот

Настройка привязки пользовательских атрибутов Kotlin

Я пытаюсь установить настраиваемый атрибут, используя Android DataBinding Library в моем проекте Kotlin:

Разметка

<ImageView
    android:id="@+id/imgView"
    android:layout_width="40dp"
    android:layout_height="40dp"
    android:layout_gravity="center"
    android:adjustViewBounds="true"
    app:imageUrl="@{segment.url}"/>

Код

  class Utils {
        companion object {
            @BindingAdapter("bind:imageUrl")
            @JvmStatic
            fun loadImage(view: ImageView, url:String) 
            {Picasso.with(view.context).load(url).error(R.drawable.error).into(view)}
    }       

Ошибка выполнения, которую я получаю:

A BindingAdapter in in не является статическим и требует использования объекта, извлеченного из DataBindingComponent. Если вы не используете метод инфляции, берущий DataBindingComponent, используйте DataBindingUtil.setDefaultComponent или сделайте все методы BindingAdapter статическими.

Любые указатели для его решения?

Это происходит только для пользовательских атрибутов. Остальные части данных работают нормально

4b9b3361

Ответ 1

Просто держите функцию на верхнем уровне, не нужен класс или сопутствующий объект

@BindingAdapter("imageUrl")
fun loadImage(view: ImageView, url:String) { ... }

Ответ 2

Попробуйте переключить порядок аннотаций. Кажется, проблема:

class Utils {
    companion object {
        @JvmStatic @BindingAdapter("imageUrl")
        fun loadImage(view: ImageView, url:String) { ... } 
    }
} 

Проблема заключается в том, что компилятор databindng использует getCompanion().loadImage иначе *.
Вы можете проверить это в сгенерированном классе com.your.package.databinding.*Binding

* Немного поиграв, я заметил, что это не имеет никакого отношения к порядку аннотаций, но кажется случайным. Кажется, он меняется, когда я нажимаю "rebuild". Это может быть ошибка в kapt или в компиляторе kotlin

Ответ 3

Добавление @JvmStatic до @BindingAdapter("imageUrl") устранило мою проблему.

Для ex:

object BindingAdapters { @BindingAdapter("android:visibility") @JvmStatic fun setVisibility(view: View, visible: Boolean) { view.visibility = if (visible) View.VISIBLE else View.GONE } }