AndroidX с BindingAdapter

У меня возникли проблемы с работой моего BindingAdapter в моем новом приложении.

Я всегда получаю следующую ошибку:

****/ data binding error ****msg:Cannot find the setter for attribute 'visible' with parameter type boolean

Это мой BindingAdapter:

object BindingAdapters {

@set:BindingAdapter("visible")
@JvmStatic
var View.visible
    get() = visibility == View.VISIBLE
    set(value) {
        visibility = if (value) View.VISIBLE else View.GONE
    }
}

Это представление, имеющее представление в XML, порождающее проблему:

<TextView
        android:id="@+id/tvDescription"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginStart="@dimen/item_horizontal_margin_large"
        android:text="@{viewModel.item.description}"
        visible="@{viewModel.showGroup}"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintStart_toEndOf="@id/ctvDivision"
        app:layout_constraintTop_toTopOf="parent" />

Это новый проект, поэтому я начал с Android X и не нуждался в миграции.

У меня есть эта строка в build.grade:

annotationProcessor 'androidx.databinding:databinding-compiler:3.4.0-alpha09'

и я использую Gradle 3.2.11.

Я не уверен, если это необходимо, но это код, где я раздуваю свою привязку:

override fun onCreateView(
        inflater: LayoutInflater,
        container: ViewGroup?,
        savedInstanceState: Bundle?
): View? {
    // Inflate the layout for this fragment
    setHasOptionsMenu(true)

    binding = DataBindingUtil.inflate(
            layoutInflater,
            R.layout.fragment_good,
            container,
            false
    )

    val view = binding?.root
    binding?.viewModel = viewModel

    return view
}

Все остальные стандартные средства привязки данных работают. Как только я пытаюсь настроить BindingAdapter, происходит сбой.

Я читал на SO, что некоторые люди утверждали, что привязка данных не работает должным образом с X. Но это были посты за октябрь, и были люди, утверждающие, что они отлично сработали в том же посте.

Я забыл что-то глупое или это действительно еще не работает с X?

1 ответ

Я воспроизвожу проблему в небольшом новом проекте, используя Kotlin (1.3.30), AndroidX, DataBinding и Gradle 3.4.0

Во-первых, Котлин не работает с annotationProcessor и должен быть заменен инструментом обработки аннотаций Kotlin: kapt с kotlin-kapt плагин.
Котлинская документация

Затем в Gradle 3.1.0-alpha06 Google включил новую версию компилятора привязки данных, включенную по умолчанию, начиная с Gradle 3.2.
Так что вам не нужно использовать databinding-compiler зависимость (интегрирована).
Документация для разработчиков Android

Но даже интегрированный, это всегда нужно капт.
Итак, добавьте apply plugin: 'kotlin-kapt' на вершине вашего build.gradle файлприложения и удалите androidx.databinding:databinding-compiler зависимость, должна решить проблему. (Это сработало для меня)

Я столкнулся с той же проблемой. Если ваши адаптеры связывания написаны на Kotlin (вместо Java), то вы больше не можете передавать им примитивные логические переменные Java (или любые примитивные типы Java). Измените ваш viewModel.showGroup на Java.lang.Boolean или предпочтительно на Kotlin Boolean.

Я также заметил, что если вы используете логическое выражение в выражении привязки данных, например visible="@{viewModel.showGroup &amp;&amp; true}", то это выводит Java примитивный логический и больше не совместим с адаптерами связывания Kotlin.

Другие вопросы по тегам