safeUnbox() 无法反转

2023-12-09

我试图消除 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(使用前将#替换为@)

safeUnbox() 无法反转 的相关文章

随机推荐

  • 使用 Linq 表达式和反射获取属性值的通用方法

    亲爱的反思之神 我想要一个通用的GetValue
  • 正则表达式 match() 无法捕获 python 中的简单模式

    我正在尝试在 Python 中使用一些简单的正则表达式函数 我正在使用正则表达式来捕获阿拉伯字母表中的模式 但在最简单的情况下 当人们在模式的开头添加几个字母时 无论是否有连字 它似乎都不起作用 gt gt gt p re compile
  • 等待几秒钟而不阻止 UI 执行

    我想在两条指令之间等待几秒钟 但不阻止执行 例如 Thread Sleep 2000 这不好 因为它会阻塞执行 我的想法是 我调用一个方法 然后等待 X 秒 例如 20 秒 监听即将到来的事件 在 20 秒结束时 我应该根据 20 秒内发生
  • C#.NET 使用 Windows 服务获取计算机的用户名

    我很难获取使用 Windows 服务登录计算机的人的用户名 当同时使用 System Environment UserName 或 WindowsIdentity GetCurrent UserName 时 我得到 NTAUTHORITY
  • 了解Android 6权限方法

    我试图从图库中获取图像并将其设置为图像视图 但在 Android 6 中存在一些权限问题 以下是请求许可的方法 我应该要求读取外部存储还是写入外部存储 这是我到目前为止所做的 private static final int READ CO
  • 如何使用 tastypie 登录 django

    我试图在自定义身份验证中覆盖 is authenticated 我有一些简单的事情 首先 是这样的 class MyAuthentication BasicAuthentication def init self args kwargs s
  • md-icons 如何在浏览器上呈现

    我在我的项目中使用了material2和Material图标 我想知道这些命名图标是如何在浏览器中呈现的 我用过
  • 电子重建内发生未处理的错误

    我正在尝试使用 Sqlite3 重建我的 ElectronJS 应用程序 我已经安装了 Python VS 开发工具 但它仍然给我错误 我的 Package json name hello version 1 0 0 description
  • django中如何区分首次注册用户和常规登录用户

    我所有的工作都使用 django allauthsignin signup and logout功能和工作正常 现在我有一个功能 1 当用户第一次注册并登录时 我需要将他重定向到成功页面 验证页面 success 2 当已经注册的用户登录时
  • 使用 boost::spirit 以任意顺序解析命名参数

    我正在为一种输入文件编写一个解析器 输入文件看起来像 CalculationBlock CalculationTitle Test Parser Input System MatchingRadius 25 0 StepSize 0 01
  • 如何使用 solc 0.5 编译 Solidity

    编译 js const path require path const solc require solc const fs require fs extra const buildPath path resolve dirname bui
  • 当我打印新值时,我得到以前的浮点值

    我正在得到输出0 23从第二个printf 但类型转换给出了所需的输出 如果我不使用类型转换 则会打印先前的值 编译器版本是GCC 6 3 include
  • 如何分析 .net 垃圾收集器?

    我想知道如何分析垃圾收集器的性能并监控三代 我想知道是否有可能在任何时间点知道当前对象生活在什么地方gen0 gen1 gen2 你可以得到PerfMon 中有关 GC 性能的有用信息 但没有你想要的那么细化 NET内存性能有很多 计数器
  • 如何让 geom_errorbar 在 ggplot2 的条形图上正确“闪避”?

    我正在尝试制作带有误差线的分组条形图 但是 我无法使误差条看起来正确 即比主条更薄 并且位置正确 位于条的中心 这position选项和position dodge 似乎工作不正常 我不明白为什么 根据其他类似问题的例子 这应该有效 我正在
  • mybatis中动态使用HashMap进行参数映射

    好的 这有点重新发布这个问题使用 ibatis 将 HashMap 值插入表 但我正在寻找一种不同的方式 答案对我不起作用 DB1GetStudentDataMapper xml 这查询一个数据库
  • 在 Laravel 4 的 Eloquent 中使用枢轴模型数据作为与另一个模型的关系

    我有一个用于多对多关系的数据透视表 其中包括另一个模型的第三个索引参数 我希望能够使用 Eloquent 来访问这个模型 在我的应用程序中 我有一个User谁可以拥有很多Subjects还有很多Semesters 当用户拥有Subject
  • 当选择另一个单选按钮时,如何将其更改为“选中”?

    我希望你们能帮我解决这个问题 我怎样才能有一个单选按钮id A 将其属性更改为 已检查 当单选按钮id B 被选中 单选按钮 A 和 B 位于不同的组中 Thanks
  • 如何编写反汇编程序? [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心以获得指导 我有兴趣编写一个 x86
  • Yii CMultiFileUpload 选择多个文件

    得到了答案 将多个文件上传到数据库进行注册 已经尝试了很多方法来使用 CMultiFileUpload 小部件使多个文件上传可行 我已经检查并关注了以下链接 http www yiiframework com forum index php
  • safeUnbox() 无法反转

    我试图消除 Android 应用程序的所有警告 其中之一是 viewModel value 是一个装箱字段 但需要取消装箱才能执行 android checked 这可能会导致 NPE 因此数据绑定将安全地拆箱它 您可以更改表达式并使用 s