我正在尝试消除我的 Android 应用程序的所有警告,其中之一是:
viewModel.value 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.value with safeUnbox() to prevent the warning
其中值是来自父类(super class)的通用 ObservableField
:
public abstract class BaseDataTypeViewModel<T> extends BaseObservable {
public final ObservableField<T> value = new ObservableField<>();
...
}
并且在某处扩展为 bool 值
:
public class CheckBooleanDataTypeViewModel extends BaseDataTypeViewModel<Boolean> {
...
}
我在 data binding - safeUnbox warning 上看到了出现警告是因为这是一个 Boolean
而不是 boolean
,所以我尝试添加这个:android:checked="@={safeUnbox(viewModel. value)}"
而不是 android:checked="@={viewModel.value}"
但后来我收到一条错误消息,说我无法反转 safeUnbox()
方法。
****/ data binding error ****msg:The expression android.databinding.DynamicUtil.safeUnbox(viewModelValue) cannot be inverted: There is no inverse for method safeUnbox, you must add an @InverseMethod annotation to the method to indicate which method should be used when using it in two-way binding expressions
我正确理解了这 2 个独立的问题,但我是否必须接受警告以避免错误,或者它们是否是同时避免警告和错误的解决方案?它正在谈论的 @InverseMethod
怎么样?我没有设法添加此注释,因为该方法来自 android 包。
最佳答案
我没有以这种特殊方式使用 Android 架构组件或数据绑定(bind)库,但我认为我仍然可以提供帮助。
在您的 XML 中,您有:
android:checked="@={viewModel.value}"
系统给你一个警告是因为它想让你知道在 viewModel.value
是 null
的情况下,它会做一些特别的事情(表现为尽管它可能是 false
)。它通过 safeUnbox()
方法执行此操作。
要解决警告,建议显式调用 safeUnbox()
。你不能那样做,因为没有 safeUnbox()
的“逆”从 boolean
到 Boolean
back>.
但这听起来并不像你必须使用safeUnbox()
;您可以创建自己的方法将 Boolean
转换为 boolean
,然后您可以使用建议的注释来声明哪个方法将从 boolean
转换回来为 bool 值
。
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 中学到的
关于android - safeUnbox() 不能反转,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47335090/