Android 数据绑定-safeUnbox警告
在我升级为gradle版本到2.3.0之后, 数据绑定遇到警告: 警告:selectMap[index]是一个已装箱的字段,但需要取消装箱才能执行selectMap[index]@android:color/white:@android:color/transparent。这可能会导致NPE,因此数据绑定将安全地解除其绑定。您可以更改表达式,并使用safeUnbox()显式包装selectMap[index],以防止出现警告 selectMap是一个ObservableMap,然后我搜索了这个警告,但只得到了一些讨论,并没有修复它 我按照链接中的方法,将Android 数据绑定-safeUnbox警告,android,data-binding,android-gradle-plugin,warnings,android-databinding,Android,Data Binding,Android Gradle Plugin,Warnings,Android Databinding,在我升级为gradle版本到2.3.0之后, 数据绑定遇到警告: 警告:selectMap[index]是一个已装箱的字段,但需要取消装箱才能执行selectMap[index]@android:color/white:@android:color/transparent。这可能会导致NPE,因此数据绑定将安全地解除其绑定。您可以更改表达式,并使用safeUnbox()显式包装selectMap[index],以防止出现警告 selectMap是一个ObservableMap,然后我搜索了这个警
selectMap[index]
修改为safeUnbox(selectMap[index])
但出现语法错误
有人知道如何修复这个警告吗
编辑: 以下是xml文件代码
<?xml version="1.0" encoding="utf-8"?>
构建成功,但出现了警告(我在上面已经过了)。我收到了相同的警告,在我的例子中,将变量声明从布尔类型更改为布尔类型解决了问题: 发件人:
致:
所以,也许你可以尝试一下:
<variable
name="selectMap"
type="android.databinding.ObservableMap<Integer, boolean>" />
您可以像这样添加safeUnbox:
android:text="@{Double.toString(safeUnbox(product.listPrice))}"
将safeUnbox()
添加到警告变量将使此警告消失,并且仍能正常工作
android:alpha="@{alpha != null ? safeUnbox(alpha) : 0.5f}"
我在执行以下操作时弹出了此警告:
android:visibility="@{viewmodel.isLoading ? View.INVISIBLE : View.VISIBLE}"
像这样添加safeunbox:
android:visibility="@{safeUnbox(viewmodel.isLoading) ? View.INVISIBLE : View.VISIBLE}"
已删除重建后的警告
w:警告:已启用是一个已装箱的字段,但需要取消装箱
要执行android,请选中
出现此警告的原因是启用字段可以为空。如果使用布尔值
而不是布尔值
,则布尔值
可以为空。所以这个警告来了。此字段可以使NullPointerException
------------案例1-单向绑定-------------------
<variable
name="enabled"
type="Boolean"/>
....
<Switch
android:checked="@{enabled}"
/>
------------案例2-双向绑定-------------------
如果有双向绑定,则不能使用safeUnbox()
way,因为
解决方案2
为safeUnbox制作反向绑定适配器有很长的路要走
什么是safeUnbox()方法?
safeUnbox()
只需检查空值并返回非空值。您可以看到以下在数据绑定库中定义的方法
public static int safeUnbox(java.lang.Integer boxed) {
return boxed == null ? 0 : (int)boxed;
}
public static long safeUnbox(java.lang.Long boxed) {
return boxed == null ? 0L : (long)boxed;
}
public static short safeUnbox(java.lang.Short boxed) {
return boxed == null ? 0 : (short)boxed;
}
public static byte safeUnbox(java.lang.Byte boxed) {
return boxed == null ? 0 : (byte)boxed;
}
public static char safeUnbox(java.lang.Character boxed) {
return boxed == null ? '\u0000' : (char)boxed;
}
public static double safeUnbox(java.lang.Double boxed) {
return boxed == null ? 0.0 : (double)boxed;
}
public static float safeUnbox(java.lang.Float boxed) {
return boxed == null ? 0f : (float)boxed;
}
public static boolean safeUnbox(java.lang.Boolean boxed) {
return boxed == null ? false : (boolean)boxed;
}
我解释过布尔运算,这个解决方案对于
整数
,双精度
,字符
等都是一样的。而不是可观察字段
,你应该为原语使用特殊版本:
int
observebolean
用于布尔值
observefloat
用于float
observechar
用于char
ObservableLong
对于long
可观察字节
用于字节
observeshort
用于short
每当您使用自定义的
BindingAdapter
时,这也会出现,因此在我的例子中,我需要将第二个参数设置为可为null,并且警告消失了
@BindingAdapter("xyz")
fun xyzAdapter(view: View, value: Int?) {
value?.let {
//TODO
}
}
我没有使用Java,但如果您确保包含
@Nullable
注释,并执行空条件。您的问题代码在哪里?字符串是否也有相同的问题?在我的例子中,只有布尔型对不起,字符串没有问题,这是另外一个问题。我认为safeUnbox是一个简单的解决方案public静态布尔safeUnbox(java.lang.boolean boxed){return boxed==null?false:(boolean)boxed;}
在android.databinding.DynamicCutili不建议使用safeUnbox
方法。如果开发人员使用的是可为null的布尔
类型,并将其设置为null
,那么他或她可能不是指false
。使用不可为空的boolean
类型如果您不需要为空,请使用自定义适配器显式处理null
,或者-如果您正在使用boolean
,但不希望在当前状态下使用null
,只需让应用程序抛出NPE
,以警告您存在需要修复的错误。
<variable
name="enabled"
type="Boolean"/>
....
<Switch
android:checked="@{enabled}"
/>
<Switch
android:checked="@{safeUnbox(fieldName)}"
/>
<variable
name="enabled"
type="boolean"/>
<variable
name="enabled"
type="Boolean"/>
....
<Switch
android:checked="@={enabled}"
/>
<Switch
android:checked="@{safeUnbox(fieldName)}"
/>
<variable
name="enabled"
type="boolean"/>
public static int safeUnbox(java.lang.Integer boxed) {
return boxed == null ? 0 : (int)boxed;
}
public static long safeUnbox(java.lang.Long boxed) {
return boxed == null ? 0L : (long)boxed;
}
public static short safeUnbox(java.lang.Short boxed) {
return boxed == null ? 0 : (short)boxed;
}
public static byte safeUnbox(java.lang.Byte boxed) {
return boxed == null ? 0 : (byte)boxed;
}
public static char safeUnbox(java.lang.Character boxed) {
return boxed == null ? '\u0000' : (char)boxed;
}
public static double safeUnbox(java.lang.Double boxed) {
return boxed == null ? 0.0 : (double)boxed;
}
public static float safeUnbox(java.lang.Float boxed) {
return boxed == null ? 0f : (float)boxed;
}
public static boolean safeUnbox(java.lang.Boolean boxed) {
return boxed == null ? false : (boolean)boxed;
}
@BindingAdapter("xyz")
fun xyzAdapter(view: View, value: Int?) {
value?.let {
//TODO
}
}