AndroidX с BindingAdapter - PullRequest
       31

AndroidX с BindingAdapter

0 голосов
/ 21 декабря 2018

У меня возникли проблемы с работой моего 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?

Ответы [ 2 ]

0 голосов
/ 19 апреля 2019

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

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

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

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

0 голосов
/ 04 января 2019

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

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

...