【发布时间】:2019-11-01 23:58:25
【问题描述】:
我在使用 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 { key = 320625, value = {isDelivered=true, code=320625, drawers={0=2}, orderId=-LhdzXS4-gyT0ysNe-zi, suborderId=-LhdzYhT78y9b3iJcyrb, boxId=box_1} }
这就是下一个 print 3 lines lates 打印的内容:
代码:320625,交付:false 到抽屉:[2]
在这里我希望is delivered 是true,但由于某种原因,快照中isDelivered 的true-value 在将快照解析为PickupCode-class 时会被忽略。 PickupCode 的值isDelivered 等于类的空构造函数。
但是为什么以及如何解决?
快照中的所有其他值都会被正确解析。我是 Android 新手,但我有一种预感,ProGuard(不管那是什么)在这里有一些责任。这是我的设置方式:
-keepattributes Signature
-keepclassmembers class PickupCode.** {
*;
}
【问题讨论】:
-
println("Code: ${it.code}, is delivered: ${it.isDelivered} to drawers: ${it.drawers.toString()}")中的isDelivered的值是多少?与println(snapshot)中的相同? -
Nope :/ 那就是下面引用中提到的那个。这是
false.. -
但是如果你尝试在
pickupCode?.let块之外打印it.isDelivered,值是多少? -
我找到了解决办法,见下文:)
-
很高兴听到这个消息 :) 我回答了一个类似的问题here。
标签: android firebase firebase-realtime-database kotlin proguard