使用ProGuard时Firebase实时数据库Snapshot转Kotlin数据类异常
问题原因与解决方案
核心原因
你的问题根源在于ProGuard配置的语法错误,导致isDelivered字段的相关成员没被正确保留,Firebase无法通过反射识别这个属性,只能回退使用空构造函数的默认值false。
看你当前的ProGuard规则:
-keepclassmembers class PickupCode.** { *; }
这里的PickupCode.**是用来匹配PickupCode包下的所有类(或子类),但你的PickupCode本身是一个独立的数据类,并非包名,所以这条规则根本没作用到目标类上。其他字段正常是因为代码中可能直接引用过它们,ProGuard没进行混淆,但isDelivered的相关方法/字段被混淆后,Firebase无法按照JavaBean规范找到对应的映射关系。
解决方案
你有两种简单可靠的修复方式:
1. 修正ProGuard规则
把规则改成直接保留PickupCode类的所有成员,去掉多余的**,同时记得替换成你实际的包名:
-keepattributes Signature -keepclassmembers class com.your.actual.package.PickupCode { *; }
这样ProGuard就不会混淆这个类的任何字段和方法,Firebase就能正常解析所有属性了。
2. 使用@Keep注解(更推荐)
在PickupCode数据类上添加AndroidX提供的@Keep注解,直接告诉ProGuard不要混淆这个类的任何成员,无需手动维护ProGuard规则:
import androidx.annotation.Keep @Keep 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 } }
这种方式更简洁,也不容易出错,非常适合Kotlin数据类的场景。
验证方法
你可以先临时关闭ProGuard(在build.gradle中将minifyEnabled设为false)测试,如果isDelivered能正确解析为true,就完全可以确认是ProGuard配置的问题,按照上面的方法修复即可。
内容的提问来源于stack exchange,提问作者Wiingaard
相关产品推荐
相关产品推荐

