safeUnbox()不能被反转

MHo*_*gge 4 android warnings android-databinding

我正在尝试消除我的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<>();
    ...
}
Run Code Online (Sandbox Code Playgroud)

并在某处作为一个扩展Boolean:

public class CheckBooleanDataTypeViewModel extends BaseDataTypeViewModel<Boolean> {
    ...
}
Run Code Online (Sandbox Code Playgroud)

我看到数据绑定 - safeUnbox警告发生警告,因为这是一个Boolean而不是一个boolean,所以我试图添加这个:android:checked="@={safeUnbox(viewModel.value)}"而不是android:checked="@={viewModel.value}"然后我得到一个错误说我无法反转safeUnbox()方法.

****/数据绑定错误****msg:表达式android.databinding.DynamicUtil.safeUnbox(viewModelValue)无法反转:方法safeUnbox没有反转,必须在方法中添加@InverseMethod注释才能指示在双向绑定表达式中使用它时应该使用哪个方法

我正确地理解了2个分离的问题,但是我必须忍受警告以避免错误,或者他们是避免警告和错误的解决方案吗?这@InverseMethod是怎么回事?我没有设法添加这个注释,因为该方法来自android包.

Ben*_* P. 10

我没有以这种特殊方式使用Android架构组件或数据绑定库,但我认为我仍然可以提供帮助.

在你的XML中,你有这个:

android:checked="@={viewModel.value}"
Run Code Online (Sandbox Code Playgroud)

该系统是给你一个警告,因为它要你知道,在情况viewModel.valuenull,它会做一些特殊的(行为就好像它是false不是,大概).它通过该safeUnbox()方法完成此操作.

要解决警告,建议将safeUnbox()呼叫显式化.你不能这样做,因为没有"反"的safeUnbox()booleanBoolean.

但它听起来并不像你必须使用safeUnbox(); 你可以创建自己的方法转换Booleanboolean,然后你可以使用建议注释来声明该方法将转换回从booleanBoolean.

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;
    }
}
Run Code Online (Sandbox Code Playgroud)

现在您可以将XML更改为:

android:checked="@={com.example.stackoverflow.MyConversions.myUnbox(viewModel.value)}"
Run Code Online (Sandbox Code Playgroud)

我希望这有帮助.如果事实证明我离开基地,请告诉我; 我想更多地了解这个话题.

我从https://medium.com/google-developers/android-data-binding-inverse-functions-95aab4b11873中学到的答案中的大部分内容