我试图消除 Android 应用程序的所有警告,其中之一是:
viewModel.value 是一个装箱字段,但需要取消装箱才能执行 android:checked。这可能会导致 NPE,因此数据绑定将安全地拆箱它。您可以更改表达式并使用 safeUnbox() 显式包装 viewModel.value 以防止出现警告
其中 value 是通用的ObservableField
来自超类:
public abstract class BaseDataTypeViewModel<T> extends BaseObservable {
public final ObservableField<T> value = new ObservableField<>();
...
}
并在某处扩展为Boolean
:
public class CheckBooleanDataTypeViewModel extends BaseDataTypeViewModel<Boolean> {
...
}
我看到了数据绑定 - safeUnbox 警告发生警告是因为这是Boolean
而不是一个boolean
,所以我尝试添加这个:android:checked="@={safeUnbox(viewModel.value)}"
代替android:checked="@={viewModel.value}"
但后来我收到一个错误,说我无法反转safeUnbox()
method.
****/ 数据绑定错误 ****msg:表达式 android.databinding.DynamicUtil.safeUnbox(viewModelValue) 无法反转:方法 safeUnbox 没有反转,必须在方法上添加 @InverseMethod 注解来指示在双向绑定表达式中使用时应使用哪种方法
我正确理解了这两个独立的问题,但是我是否必须忍受警告以避免错误,或者它们是避免警告和错误的解决方案吗?关于@InverseMethod
它在谈论什么?我没有设法添加这个注释,因为该方法来自 android 包。
我还没有以这种特殊的方式使用 Android 架构组件或数据绑定库,但我认为我仍然可以提供帮助。
在您的 XML 中,您有以下内容:
android:checked="@={viewModel.value}"
系统向您发出警告是因为它希望您知道,在以下情况下viewModel.value
is null
,它将做一些特别的事情(表现得好像它是false
相反,大概)。它通过safeUnbox()
method.
为了解决这个警告,它建议safeUnbox()
调用显式。你不能这样做,因为没有“逆”safeUnbox()
to go back from boolean
to Boolean
.
但听起来你不必使用safeUnbox()
;您可以创建自己的转换方法Boolean
to boolean
,然后您可以使用建议的注释来声明哪个方法将从boolean
to Boolean
.
public class MyConversions {
@InverseMethod("myBox")
public static boolean myUnbox(Boolean b) {
return (b != null) && b.booleanValue();
}
public static Boolean myBox(boolean b) {
return b ? Boolean.TRUE : Boolean.FALSE;
}
}
现在您可以将 XML 更改为:
android:checked="@={com.example.stackoverflow.MyConversions.myUnbox(viewModel.value)}"
我希望这有帮助。如果事实证明我偏离了基地,请告诉我;我很想了解更多关于这个话题的信息。
我在这个答案中学到的大部分内容https://medium.com/google-developers/android-data-binding-inverse-functions-95aab4b11873
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)