这是我得到的错误。
> 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
应该解决这个问题?我在这里遗漏了什么?
当你包含一个布局并想改变它的可见性时,你应该通过参数来实现。按照你的例子,你的布局 查看_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%安全起见,我想你最好用别的东西来命名你的自定义函数。
希望能帮到你!谢谢