专家,
我正在尝试禁止双向绑定属性(Android / Kotlin)的safeUnbox警告。为此,我使用不同数据类型的自定义拆箱功能创建了一个单例(请参见下文)。
我的构建失败,并出现以下错误。可能是由于Kotlin使用kotlin.Boolean作为'checked'变量的数据类型,而Binding功能使用了java.lang.Boolean。
关于如何解决此问题的任何建议,我们将不胜感激。谢谢!
错误消息:**** /数据绑定错误**** msg:在com.example.ui.bindingAdapters.InverseSafeUnboxBindingAdapter类中找不到方法unbox(java.lang.Boolean)
ViewModel定义:
var checked = MutableLiveData(false)
card_example.xml:
<com.google.android.material.checkbox.MaterialCheckBox
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:checked="@={com.example.ui.bindingAdapters.InverseSafeUnboxBindingAdapter.unbox(vm.checked)}"/>
绑定适配器:
package com.example.ui.bindingAdapters
import androidx.databinding.InverseMethod
object InverseSafeUnboxBindingAdapter {
@InverseMethod("boxBoolean")
fun unbox(b: Boolean?): Boolean {
return b as Boolean
}
fun boxBoolean(b: Boolean): Boolean? {
return b
}
}
我确实找到了解决此问题的可行解决方案。诀窍是创建将unbox和inverse函数实现为Java文件而不是Kotlin的代码。
我使用如下所示的代码创建了一个Java文件,并能够在XML文件中使用它以及双向绑定变量。
import androidx.databinding.InverseMethod;
public class CustomSafeUnboxAdapter {
@InverseMethod("boxBoolean")
public static boolean unbox(Boolean boxed) {
return (boxed != null) && boxed.booleanValue();
}
public static Boolean boxBoolean(boolean unboxed) {
return unboxed ? Boolean.TRUE : Boolean.FALSE;
}
}