Не удается найти метод safeUnbox (java.lang.Boolean) в классе android.databinding.ViewDataBinding - PullRequest
0 голосов
/ 10 сентября 2018

Я новичок с библиотекой привязки данных 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

Это определяется следующим образом:

В ViewModel

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

В граде уже определено

dataBinding {
        enabled = true
    }

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

Есть мысли как это исправить? Android Studio 3.1.4 Gradle 4.4 Котлин 1.2.61

P.S. только что получил дубликат на вопрос. Все вопросы о том, как исправить предупреждение, но мой вопрос, как исправить ошибку компиляции при добавлении safeUnbox()

1 Ответ

0 голосов
/ 18 сентября 2018

Я говорю о Boolean, это решение одинаково для Integer, Double, Character и т. Д.

Если у вас есть двусторонняя привязка, то вы не можете использовать safeUnbox() way, потому что safeUnbox() не будет инвертировано .

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

....

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

Решение 1

Изменить Boolean на примитивный тип boolean. Чтобы оно никогда не было нулевым, значение по умолчанию из boolean равно false.

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

Решение 2

Долгий путь состоит в создании метода для safeBox и safeUnbox . Смотрите здесь .

Что такое метод 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;
}
...