Связывание данных: ObservableField со значением лямбда не компилируется

Я пытаюсь определить видимость представления, вычисляя lambda, который принимает один параметр в качестве аргумента. Я использую Kotlin , кстати.

В моей ViewModel меня есть:

  val customerPropVisibility: ObservableField<(KProperty1<Customer, *>) -> Int> = ObservableField( { _ -> // body of the lambda }) 

Выражение для View выглядит следующим образом:

  android:visibility="@{vm.customerPropVisibility.invoke(title)}" 

vm и title должным образом объявляются переменными в теге данных макета.

При компиляции я получаю две ошибки:

1) несовместимые типы: объект не может быть преобразован в Function1

2) несовместимые типы: объект не может быть преобразован в Integer

Существует только одна ошибка первого типа и несколько ошибок второго типа. Количество ошибок второго типа совпадает с количеством вызовов lambda в XML-файле макета.

Мои попытки решить проблему:

Очевидно, что ошибка типа 1 может быть решена путем переопределения метода get() ObservableField (что делает метод явно возвращать Function1 ). Это работает, но является уродливым и должно выполняться компилятором, когда он указывает тип для customerPropVisibility . Определенно, здесь что-то не так.

Ошибка типа 2 является для меня загадкой, потому что тип функции (моя лямбда) явно возвращает Int.

Я предполагаю, что он имеет какое-то отношение к взаимодействию Kotlin / Java.

Если вы столкнулись с одной и той же проблемой, пожалуйста, поделитесь опытом ее решения.

РЕДАКТИРОВАТЬ:

Поскольку эта ошибка еще не решена, я использую несколько иной подход для достижения того же результата:

Вместо того, чтобы установить значение ObservableField в лямбда, я установил его в функцию reference ( ::getVisibility ) следующим образом:

 fun getVisibility(prop: KProperty1<*, *>): Int = propVisibilityValues[prop] ?: View.GONE val propVisibilityGetter = ObservableField(::getVisibility) 

И всякий раз, когда изменяется propVisibilityValues я уведомляю propVisibilityGetter :

 private val propVisibilityValues = ObservableArrayMap<KProperty1<*, *>, Int>().apply { addOnMapChangedCallback(object : ObservableMap.OnMapChangedCallback<ObservableMap<KProperty1<*, *>, Int>, KProperty1<*, *>, Int>() { override fun onMapChanged(p0: ObservableMap<KProperty1<*, *>, Int>?, p1: KProperty1<*, *>?) { propVisibilityGetter.notifyChange() } }) } 

В XML-макете выражение привязки выглядит так:

 android:visibility="@{vm.propVisibilityGetter.call(title)}" 

Общий результат: беспорядочный в модели просмотра, но чистые выражения привязки.

Interesting Posts

Как использовать OnClickListener для создания простого события // Изменение текста или цвета

Текст ярлыка не обновляется, хотя поток пользовательского интерфейса кажется отзывчивым

Kotlin, когда несколько значений не работают, когда значение представляет собой вид android

Можно ли получить подкласс класса Kotlin из суперкласса?

Метод копирования класса данных Kotlin не выполняет глубокое копирование всех членов

Просмотры события касания заполняет весь экран

Android-приложение без классов?

Запись в файл после матча в Котлине

Kotlin: Что такое файл kjsm?

Функции расширения Котлина и функции-члены?

Плагин Kaptlin для kaptlin для градиента не работает для настраиваемого исходного набора (JMH)

Java и Kotlin кастинг с дженериками. Потеря безопасности

Котлин. Какое использование класса без тела?

Конструктор по умолчанию для IntentService (kotlin)

kotlin и @Valid Spring аннотация

Давайте будем гением компьютера.