【问题标题】:Cannot find method safeUnbox(java.lang.Boolean) in class android.databinding.ViewDataBinding在类 android.databinding.ViewDataBinding 中找不到方法 safeUnbox(java.lang.Boolean)
【发布时间】:2023-03-17 05:35:02
【问题描述】:

我是 Android 数据绑定库的新手。

我有一堆警告,例如:

warning: viewModel.someBoolean.getValue() 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.someBoolean.getValue() with safeUnbox() to prevent the warning

定义如下:

在视图模型中

val someBoolean: MutableLiveData<Boolean> = MutableLiveData()

在布局中

<RadioButton
    android:id="@+id/someBooleanRadioButton"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:checked="@={viewModel.someBoolean}"
    android:text="@string/boolean_description" />

我尝试通过添加 safeUnbox() 来修复它:

<RadioButton
    android:id="@+id/someBooleanRadioButton"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:checked="@={safeUnbox(viewModel.someBoolean)}"
    android:text="@string/boolean_description" />

但我收到编译错误:

msg:cannot find method safeUnbox(java.lang.Boolean) in class android.databinding.ViewDataBinding

在gradle中已经定义了

dataBinding {
        enabled = true
    }

kapt 'com.android.databinding:compiler:3.1.4'

任何想法如何解决它? 安卓工作室 3.1.4 梯度 4.4 Kotlin 1.2.61

附:刚刚在问题上重复了。所有问题都是关于如何修复警告,但我的问题是添加safeUnbox()时如何修复编译错误

【问题讨论】:

  • @nilesh-rathod 我不认为它是重复的
  • @NileshRathod 这个问题是关于如何修复“无法反转表达式 android.databinding.DynamicUtil.safeUnbox(viewModelValue)”,但我的问题是关于如何修复“msg:cannot find method safeUnbox (java.lang.Boolean) 在类 android.databinding.ViewDataBinding"。我认为这有点不同,不是吗?
  • 我也认为这是一个重复

标签: android android-databinding


【解决方案1】:

我说的是布尔值,这个解决方案对于 Integer、Double、Character 等都是一样的。

当你有双向绑定时,你不能使用safeUnbox()的方式,因为safeUnbox() will not be inverted

<variable
    name="enabled"
    type="Boolean"/>

....

<Switch
    android:checked="@={enabled}"
    />

解决方案 1

Boolean 更改为原始类型boolean。所以它永远不会为空,booleandefault value 是假的。

<variable
    name="enabled"
    type="boolean"/>

解决方案 2

safeBoxsafeUnbox 方法制作方法还有很长的路要走。 See here.

什么是 safeUnbox() 方法?

safeUnbox() 只检查空值并返回非空值。您可以看到以下数据绑定库中定义的方法。

public static int safeUnbox(java.lang.Integer boxed) {
    return boxed == null ? 0 : (int)boxed;
}
public static long safeUnbox(java.lang.Long boxed) {
    return boxed == null ? 0L : (long)boxed;
}
public static short safeUnbox(java.lang.Short boxed) {
    return boxed == null ? 0 : (short)boxed;
}
public static byte safeUnbox(java.lang.Byte boxed) {
    return boxed == null ? 0 : (byte)boxed;
}
public static char safeUnbox(java.lang.Character boxed) {
    return boxed == null ? '\u0000' : (char)boxed;
}
public static double safeUnbox(java.lang.Double boxed) {
    return boxed == null ? 0.0 : (double)boxed;
}
public static float safeUnbox(java.lang.Float boxed) {
    return boxed == null ? 0f : (float)boxed;
}
public static boolean safeUnbox(java.lang.Boolean boxed) {
    return boxed == null ? false : (boolean)boxed;
}

【讨论】:

    【解决方案2】:

    尝试删除app目录下的build文件夹:app/build

    从应用程序的某些代码部分中删除数据绑定后,我遇到了这个错误。看起来从以前的代码生成的一些绑定仍然存在于缓存中。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-04-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-04-30
      相关资源
      最近更新 更多