我遇到了使用ProGuard将快照从Firebase实时数据库粘贴到Kotlin中的数据类的问题。
以下是数据在Firebase控制台中的显示方式:
这是我在Android应用中为该数据类建模的方式:
data class PickupCode(
val code: String,
val boxId: String,
val orderId: String,
val suborderId: String,
val drawers: List<Int>,
val isDelivered: Boolean
) {
constructor(): this("", "", "","", emptyList(), false)
override fun toString(): String {
return code
}
}
这是我建立数据库请求的方式:
val reference = database.getReference("pickupCodes/$boxId/$code")
val listener = object : ValueEventListener {
override fun onDataChange(snapshot: DataSnapshot) {
if (snapshot.exists()) {
println(snapshot)
val pickupCode = snapshot.getValue<PickupCode>(PickupCode::class.java)
pickupCode?.let {
println("Code: ${it.code}, is delivered: ${it.isDelivered} to drawers: ${it.drawers.toString()}")
if (!it.isDelivered) {
// No success
} else {
// Success!
}
} ?: run {
// No success
}
} else {
// No success
}
}
override fun onCancelled(error: DatabaseError) {
// No success
}
}
这是println(snapshot)
行的打印内容:
DataSnapshot {键= 320625,值= {isDelivered = true,代码= 320625,抽屉= {0 = 2},orderId = -LhdzXS4-gyT0ysNe-zi,suborderId = -LhdzYhT78y9b3iJcyrb,boxId = box_1}}
这是下一行打印3行的最新内容:
代码:320625,已交付:对抽屉为假:[2]
在这里,我希望is delivered
为true
,但是出于某种原因,将快照中的true
的{{1}}值解析为{ {1}}级。 isDelivered
的值PickupCode
等于该类的空构造函数。
但是为什么以及如何解决?
快照中的所有其他值都会得到正确解析。我是Android的新手,但我有种直觉,认为ProGuard(无论是哪种方式)都应归咎于此。.这是我的设置方法:
isDelivered
答案 0 :(得分:0)
我找到了解决方案。 查看详细日志时,我发现了这一点:
W / ClassMapper:在com.x.y.models.PickupCode类上找不到isDelivered的设置程序/字段
玩了一会儿之后,我发现出于某些奇怪的原因,以is
开头的属性的设置方法被忽略了:S我也测试了其他属性名称和类型。 val isBerp: Number
得到同样的警告。
因此,在类和firebase中将属性名称从isDelivered
更改为delivered
之后,它就可以工作。.
我无法找到有关此行为的文档,因此,如果有人知道这一点,将不胜感激链接。