Kotlin & Databinding Int 值空检查问题
Kotlin & Databinding Int value null check issue
这是我遇到过的最奇怪的问题。
因此,kotlin 和数据绑定再次让我陷入困境。我用代码开始我的问题。
型号class
data class ModelBottomItem(
@StringRes val name: Int,
@DrawableRes val image: Int,
val gender: Int = 0,
val enabled: Boolean = true,
val disabledIconColor: Int = 0)
: BaseModel()
布局代码
<variable
name="item"
type="myModel"/>
<TextView
android:text="@{item.gender == 0 ? @string/male : @string/female}"
...
/>
调试跟踪列表
0 = {ModelBottomItem@6406} "ModelBottomItem(name=2131755043, image=2131230862, gender=0, enabled=true, disabledIconColor=0)"
08-10 12:57:12.388 24902-24902/acr.browser.barebones E/AndroidRuntime: FATAL EXCEPTION: main
Process: acr.browser.barebones, PID: 24902
java.lang.NullPointerException: Attempt to invoke virtual method 'int java.lang.Integer.intValue()' on a null object reference
blah, blah !!
如果我改变item.gender == null
然后代码无法构建。它因以下错误而失败。
error: incomparable types: int and <null>
itemGenderJavaLangObjectNull = (itemGender) == (null);
两行理解问题。
- 当我检查
item.gender == null
时显示错误 incomparable types: int and <null>
.
- 当我检查
item.gender == 0
时,如果为 0,代码将崩溃并显示 int java.lang.Integer.intValue()' on a null object reference
在 运行 时间。即使你可以看到调试跟踪,我的模型项是 0,而不是 **null**
。即使我已经将默认值设置为性别,即val gender: Int = 0
。 那怎么可能是null或者0呢?
对于这种情况,请像这样使用 toIntOrNull()
item.gender.toString().toIntOrNull()
例子
val numb=""
val numb2="7"
val print1=numb.toIntOrNull()
println(print1) //out put is null
val print2=numb2.toIntOrNull()
println(print2) // output is 7
您的数据模型使用可为空的 Int?
gender: Int? = 0 as parameter
像这样
data class ModelBottomItem(
@StringRes val name: Int,
@DrawableRes val image: Int,
val gender: Int?= 0,
val enabled: Boolean = true,
val disabledIconColor: Int = 0)
: BaseModel()
您似乎没有在 Activity.
中正确调用 yourActivityBinding.setItem(your_item)
尝试在您的 activity 中添加断点以确认您没有将空项目绑定到布局
这也有效:
android:someBinding="@{(Integer) null}"
这是我遇到过的最奇怪的问题。
因此,kotlin 和数据绑定再次让我陷入困境。我用代码开始我的问题。
型号class
data class ModelBottomItem(
@StringRes val name: Int,
@DrawableRes val image: Int,
val gender: Int = 0,
val enabled: Boolean = true,
val disabledIconColor: Int = 0)
: BaseModel()
布局代码
<variable
name="item"
type="myModel"/>
<TextView
android:text="@{item.gender == 0 ? @string/male : @string/female}"
...
/>
调试跟踪列表
0 = {ModelBottomItem@6406} "ModelBottomItem(name=2131755043, image=2131230862, gender=0, enabled=true, disabledIconColor=0)"
08-10 12:57:12.388 24902-24902/acr.browser.barebones E/AndroidRuntime: FATAL EXCEPTION: main Process: acr.browser.barebones, PID: 24902 java.lang.NullPointerException: Attempt to invoke virtual method 'int java.lang.Integer.intValue()' on a null object reference
blah, blah !!
如果我改变item.gender == null
然后代码无法构建。它因以下错误而失败。
error: incomparable types: int and <null> itemGenderJavaLangObjectNull = (itemGender) == (null);
两行理解问题。
- 当我检查
item.gender == null
时显示错误incomparable types: int and <null>
. - 当我检查
item.gender == 0
时,如果为 0,代码将崩溃并显示int java.lang.Integer.intValue()' on a null object reference
在 运行 时间。即使你可以看到调试跟踪,我的模型项是 0,而不是**null**
。即使我已经将默认值设置为性别,即val gender: Int = 0
。 那怎么可能是null或者0呢?
对于这种情况,请像这样使用 toIntOrNull()
item.gender.toString().toIntOrNull()
例子
val numb=""
val numb2="7"
val print1=numb.toIntOrNull()
println(print1) //out put is null
val print2=numb2.toIntOrNull()
println(print2) // output is 7
您的数据模型使用可为空的 Int?
gender: Int? = 0 as parameter
像这样
data class ModelBottomItem(
@StringRes val name: Int,
@DrawableRes val image: Int,
val gender: Int?= 0,
val enabled: Boolean = true,
val disabledIconColor: Int = 0)
: BaseModel()
您似乎没有在 Activity.
中正确调用 yourActivityBinding.setItem(your_item)尝试在您的 activity 中添加断点以确认您没有将空项目绑定到布局
这也有效:
android:someBinding="@{(Integer) null}"