带有2个参数和requireAll的自定义BindingAdapter抛出KaptExecution。

问题描述 投票:2回答:1

这是我得到的错误。

> 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()}" ... />

Where:

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 应该解决这个问题?我在这里遗漏了什么?

android kotlin android-databinding kapt android-binding-adapter
1个回答
1
投票

当你包含一个布局并想改变它的可见性时,你应该通过参数来实现。按照你的例子,你的布局 查看_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)
    }

最后一件事,有一个 核心-ktx 扩展函数isVisible。

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

所以为了100%安全起见,我想你最好用别的东西来命名你的自定义函数。

希望能帮到你!谢谢

© www.soinside.com 2019 - 2024. All rights reserved.