错误很明显,您的类“FireFran”没有无参数构造函数。当您尝试从 Cloud Firestore 反序列化对象时,Android SDK 要求类必须具有默认的无参数构造函数以及映射到每个数据库属性的设置器。
在 Kotlin 中,数据类不提供默认的无参数构造函数。因此,您需要以某种方式确保编译器所有属性都具有初始值。您可以为所有属性提供 null 的初始值或您认为更合适的任何其他值。
所以你的“FireFran”可能看起来像这样:
class FireFran(
var alarmstate: Boolean = false,
var garagestate: Boolean = false,
var id: String? = null,
var userId: String? = null,
var value: FireFranValue? = null //Newly added
) {
//var value: FireFranValue = FireFranValue(false, 0)
companion object Factory {
fun create() :FireViewModel = FireViewModel()
var COLLECTION = "device-configs"
var DOCUMENT = "alarme"
var FIELD_userId = "userId"
}
}
现在在构造函数中添加属性,Kotlin 会自动生成一个默认的无参数构造函数。这样,Firebase Android SDK 就可以使用了。它还将为每个属性生成设置器。请注意,每个属性都是 var 而不是 val,并在“id”和“userId”的情况下提供默认的空值。
如果不进行此更改,您将无法使用自动反序列化。您必须从 DocumentSnapshot 对象中读取每个属性的值,并将它们全部传递给 Kotlin 的构造函数。
编辑:
-
在您的屏幕截图中,“value”属性位于“FireFranValue”类型的对象上,该对象只有“brightness”和“on”两个属性。为了能够读取“值”下的数据,您的“FireFran”类应包含“FireFranValue”类型的新属性。请检查上面的类。
-
如果不想使用自动反序列化,可以单独获取每个属性的值。例如,您可以使用 DocumentSnapshot 的getString(String field) 方法获取“userId”属性的值:
val userId = snapshot.getString("userId")
编辑2:
你的三个类应该是这样的:
class FireFran(
var alarmstate: Boolean = false,
var garagestate: Boolean = false,
var id: String? = null,
var userId: String? = null,
var owner: String? = null,
var value: FireFranValue = FireFranValue(false),
var valorb: FireFranValueB = FireFranValueB(openPercent = 0)
)
data class FireFranValue(
var on: Boolean // = false
)
data class FireFranValueB(
var openPercent: Number // = 0
)
编辑3:
class FireFran(
var alarmstate: Boolean = false,
var garagestate: Boolean = false,
var id: String? = null,
var userId: String? = null,
var owner: String? = null,
var value: FireFranValue? = null,
var valorb: FireFranValueB? = null
)
data class FireFranValue(
var on: Boolean? = null
)
data class FireFranValueB(
var openPercent: Number? = null
)
现在,“on”和“openPercent”将从数据库中获取值。
请检查以下类声明: