带有 2 个参数和 requireAll 的自定义 BindingAdapter 抛出 KaptExecution
Custom BindingAdapter with 2 parameteres and requireAll throws KaptExecution
这是我得到的错误:
> 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
不知道怎么回事,我一直用这个方法没问题。今天我添加了 "hide" 参数和 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
不应该解决这个问题吗?我在这里错过了什么?
当您包含一个布局并想要更改它的可见性时,您应该通过参数来完成。按照你的例子,你的布局 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% 安全,我认为用其他名称命名您的自定义函数可能是个好主意。
希望对您有所帮助!
问候!
这是我得到的错误:
> 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
不知道怎么回事,我一直用这个方法没问题。今天我添加了 "hide" 参数和 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
不应该解决这个问题吗?我在这里错过了什么?
当您包含一个布局并想要更改它的可见性时,您应该通过参数来完成。按照你的例子,你的布局 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% 安全,我认为用其他名称命名您的自定义函数可能是个好主意。
希望对您有所帮助! 问候!