Пользовательский BindingAdapter с 2 параметрами и requireAll выбрасывает KaptExecution - PullRequest
2 голосов
/ 31 марта 2020

Это ошибка, которую я получил:

> Task :app:kaptDevDebugKotlin FAILED
  location: package ...app.databinding
FAILURE: Build failed with an exception.

* What went wrong:
Execution failed for task ':app:kaptDevDebugKotlin'.
> A failure occurred while executing org.jetbrains.kotlin.gradle.internal.KaptExecution
   > java.lang.reflect.InvocationTargetException (no error message)

Это мой пользовательский BindingAdapter:

@Suppress("unused")
object BindingAdapters {

    @JvmStatic
    @BindingAdapter(value = ["isVisible", "hide"], requireAll = false)
    fun setVisible(view: View, show: Boolean?, hide: Boolean?) {
        view.visibility = if (show != false) View.VISIBLE else if (hide != false) View.INVISIBLE else View.GONE
    }
...
}

Использование в макете:

<include
    layout="@layout/view_loading_small"
    isVisible="@{viewModel.isLoading()}" ... />

Где:

private val _isLoading = MutableLiveData<Boolean>(false)
val isLoading: LiveData<Boolean> = _isLoading

Я не знаю, что происходит, я всегда использовал этот метод без проблем. Сегодня я добавил параметр «скрыть» и BAM KaptExecution InvocationTargetException.
Единственный обходной путь - это изменить мой BindingAdapter объект на:

    @JvmStatic
    @BindingAdapter(value = ["isVisible", "hide"], requireAll = false)
    fun setVisible(view: View, show: Boolean?, hide: Boolean?) {
        view.visibility = if (show != false) View.VISIBLE else if (hide != false) View.INVISIBLE else View.GONE
    }

    @JvmStatic
    @BindingAdapter(value = ["isVisible"])
    fun setVisible(view: View, show: Boolean) {
        setVisible(view, show, false)
    }

Но это не имеет смысла, не так ли requireAll = false должен решить это? Что мне здесь не хватает?

1 Ответ

1 голос
/ 05 мая 2020

Когда вы включаете макет и хотите изменить его видимость, вы должны сделать это с помощью параметров. Следуя вашему примеру, ваш макет view_loading_small должен иметь следующее:

<data>
        <variable
            name="visible"
            type="boolean" />
    </data>

Примечание: Добавьте isVisible = "@ {visible}" в представление, которое вы хотите изменить видимость

И вы включаете:

<include
    layout="@layout/view_loading_small"
    app:visible="@{viewModel.isLoading()}" ... />

С этим у вас больше не должно быть проблем. Также вы можете удалить это:

 @JvmStatic
    @BindingAdapter(value = ["isVisible"])
    fun setVisible(view: View, show: Boolean) {
        setVisible(view, show, false)
    }

И, наконец, есть функция расширения core-ktx , которая называется isVisible:

inline var View.isVisible: Boolean
    get() = visibility == View.VISIBLE
    set(value) {
        visibility = if (value) View.VISIBLE else View.GONE
    }

Так что быть на 100% безопасным Я думаю, что это хорошая идея назвать вашу пользовательскую функцию как-нибудь иначе.

Надеюсь, это поможет! Привет! * * 1023

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...