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 && true}"
, то это выводит Java примитивный логический и больше не совместим с адаптерами связывания Kotlin.