You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.13 09:08:07