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

Kotlin data类映射Firebase带空格字段D8编译报错解决方案

报错根因

Kotlin 支持用反引号包裹不符合常规语法规则的标识符,仅为源码层面的语法糖,不兼容 Android DEX 编译规则:D8 编译为 DEX 字节码时,类成员的简单名称默认不允许包含空格(常规构建目标的 DEX 版本不支持该特性),因此直接声明带空格的成员变量必然触发编译失败,该方案不可行。

可行解决方法

由于你无法修改 Arduino 侧写入 Firebase 的字段名,直接使用 Firebase Realtime Database SDK 自带的字段映射注解即可完成适配,无需修改硬件侧逻辑,也不会触发编译错误:

  • 将数据类的字段名修改为符合 JVM 命名规范的合法名称(驼峰、下划线命名均可)
  • 为每个字段添加@PropertyName注解,注解参数填入 Firebase 数据库中实际的带空格键名,SDK 执行序列化/反序列化时会自动按照注解指定的名称匹配数据库字段,不会使用类内的字段名做匹配。

修正后的数据类代码如下:

package com.example.projectxyz.model.user_list

import com.google.firebase.database.PropertyName

data class DataMeasured(
    @PropertyName("X Axis")
    val xAxis: Double = 0.00,
    @PropertyName("Y Axis")
    val yAxis: Double = 0.00,
    @PropertyName("Z Axis")
    val zAxis: Double = 0.00
)

注意事项

  • 该方案同时适配读写场景:如果需要从客户端写数据回 Firebase,SDK 会自动将类内的xAxis等字段序列化为X Axis格式的键名,和 Arduino 侧的命名规则完全兼容
  • 如果构建时开启了 R8/ProGuard 混淆,需要在混淆规则文件中添加对应keep规则,避免类成员被混淆导致序列化失败:
-keep class com.example.projectxyz.model.user_list.DataMeasured { *; }
  • 移除之前添加的@file:Suppress("IllegalIdentifier")注解,该注解仅能抑制IDE的语法提示,无法解决DEX编译层面的限制。

内容的提问来源于stack exchange,提问作者pmjr

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.30 00:12:28