3

这是我得到的错误:

> 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应该解决这个问题吗?我在这里想念什么?

4

1 回答 1

1

当您包含布局并想要更改其可见性时,您应该通过参数来实现。按照你的例子,你的布局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)
    }

最后一件事,有一个名为 isVisible 的core-ktx扩展函数:

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

因此,为了 100% 安全,我认为将自定义函数命名为其他名称可能是个好主意。

希望能帮助到你!问候!

于 2020-05-05T16:50:12.627 回答