android - safeUnbox() 不能反转

标签 android warnings android-databinding

我正在尝试消除我的 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.valuenull 的情况下,它会做一些特别的事情(表现为尽管它可能是 false)。它通过 safeUnbox() 方法执行此操作。

要解决警告,建议显式调用 safeUnbox()。你不能那样做,因为没有 safeUnbox() 的“逆”从 booleanBoolean 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/

相关文章:

android - 使用 Android 数据绑定(bind)创建双向绑定(bind)

android - 如何使用数据绑定(bind)调用静态方法?

android - 在 NumberPicker 中显示更多数字

android - 如何在没有 ActionBar 的 AndroidX 中设置 BottomNavigationView

xcode - 如何在 Xcode 中禁用静态框架的警告?

php - 引用 - 这个错误在 PHP 中意味着什么?

android - 适用于 Android 的 Google 跟踪代码管理器

android - LinkMovementMethod 不滚动 TextView

Java 警告 : [options] system modules path not set in conjunction with -source 11

android - 使用 Android 数据绑定(bind)在 EditText text.length() > 0 时启用按钮