在 class android.databinding.ViewDataBinding 中找不到方法 safeUnbox(java.lang.Boolean)
Cannot find method safeUnbox(java.lang.Boolean) in class android.databinding.ViewDataBinding
我是 Android 数据绑定库的新手。
我有一堆警告,例如:
warning: viewModel.someBoolean.getValue() is a boxed field but needs to be un-boxed to execute android:checked. This may cause NPE so Data Binding will safely unbox it. You can change the expression and explicitly wrap viewModel.someBoolean.getValue() with safeUnbox() to prevent the warning
定义如下:
在视图模型中
val someBoolean: MutableLiveData<Boolean> = MutableLiveData()
布局中
<RadioButton
android:id="@+id/someBooleanRadioButton"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:checked="@={viewModel.someBoolean}"
android:text="@string/boolean_description" />
我试图通过添加 safeUnbox() 来修复它:
<RadioButton
android:id="@+id/someBooleanRadioButton"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:checked="@={safeUnbox(viewModel.someBoolean)}"
android:text="@string/boolean_description" />
但是我遇到了编译错误:
msg:cannot find method safeUnbox(java.lang.Boolean) in class android.databinding.ViewDataBinding
在gradle中已经定义
dataBinding {
enabled = true
}
和kapt 'com.android.databinding:compiler:3.1.4'
有什么解决办法吗?
Android Studio 3.1.4
Gradle 4.4
科特林 1.2.61
P.S。刚刚有重复的问题。所有问题都是关于如何修复警告,但我的问题是如何在添加 safeUnbox()
时修复编译错误
我说的是布尔值,这个解决方案对整数、双精度、字符等都是一样的
当你有双向绑定时,那么你就不能使用safeUnbox()
方式,因为.
<variable
name="enabled"
type="Boolean"/>
....
<Switch
android:checked="@={enabled}"
/>
解决方案 1
将 Boolean
更改为原始类型 boolean
。因此它永远不会为空,boolean
的 default value 为假。
<variable
name="enabled"
type="boolean"/>
解决方案 2
很长的路要走 safeBox 和 safeUnbox 方法。 .
什么是 safeUnbox() 方法?
safeUnbox()
只检查空值和 return 非空值。您可以看到以下数据绑定库中定义的方法。
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;
}
尝试删除app目录下的build文件夹:app/build
.
我在从应用程序的部分代码中删除 data-binding 后遇到了这个错误。看起来从以前的代码生成的一些绑定仍然存在于缓存中。
我是 Android 数据绑定库的新手。
我有一堆警告,例如:
warning: viewModel.someBoolean.getValue() is a boxed field but needs to be un-boxed to execute android:checked. This may cause NPE so Data Binding will safely unbox it. You can change the expression and explicitly wrap viewModel.someBoolean.getValue() with safeUnbox() to prevent the warning
定义如下:
在视图模型中
val someBoolean: MutableLiveData<Boolean> = MutableLiveData()
布局中
<RadioButton
android:id="@+id/someBooleanRadioButton"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:checked="@={viewModel.someBoolean}"
android:text="@string/boolean_description" />
我试图通过添加 safeUnbox() 来修复它:
<RadioButton
android:id="@+id/someBooleanRadioButton"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:checked="@={safeUnbox(viewModel.someBoolean)}"
android:text="@string/boolean_description" />
但是我遇到了编译错误:
msg:cannot find method safeUnbox(java.lang.Boolean) in class android.databinding.ViewDataBinding
在gradle中已经定义
dataBinding {
enabled = true
}
和kapt 'com.android.databinding:compiler:3.1.4'
有什么解决办法吗? Android Studio 3.1.4 Gradle 4.4 科特林 1.2.61
P.S。刚刚有重复的问题。所有问题都是关于如何修复警告,但我的问题是如何在添加 safeUnbox()
我说的是布尔值,这个解决方案对整数、双精度、字符等都是一样的
当你有双向绑定时,那么你就不能使用safeUnbox()
方式,因为
<variable
name="enabled"
type="Boolean"/>
....
<Switch
android:checked="@={enabled}"
/>
解决方案 1
将 Boolean
更改为原始类型 boolean
。因此它永远不会为空,boolean
的 default value 为假。
<variable
name="enabled"
type="boolean"/>
解决方案 2
很长的路要走 safeBox 和 safeUnbox 方法。
什么是 safeUnbox() 方法?
safeUnbox()
只检查空值和 return 非空值。您可以看到以下数据绑定库中定义的方法。
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;
}
尝试删除app目录下的build文件夹:app/build
.
我在从应用程序的部分代码中删除 data-binding 后遇到了这个错误。看起来从以前的代码生成的一些绑定仍然存在于缓存中。