我试图看类似的问题,但是它们对我没有用。
我有一个类:
data class TextMessage(val text: String,
override val time: Date,
override val senderId: String,
override val isText: Boolean = true)
: Message{
constructor() : this("", Date(0), "") }
然后,我尝试将其实例存储在Firestore中:
fun sendTextMessage(message: TextMessage, channelId: String) {
chatChannelsCollectionRef.document(channelId)
.collection("messages")
.add(message)
}
由于某种原因,每当我调用
sendTextMessage
时,都会出现此异常:java.lang.RuntimeException: Found conflicting getters for name isText on class com.resocoder.firemessageprep.model.TextMessage
at com.google.android.gms.internal.zzevb$zza.<init>(Unknown Source:191)
at com.google.android.gms.internal.zzevb.zzg(Unknown Source:12)
at com.google.android.gms.internal.zzevb.zza(Unknown Source:285)
at com.google.android.gms.internal.zzevb.zzbw(Unknown Source:2)
at com.google.firebase.firestore.zzk.zzcd(Unknown Source:36)
at com.google.firebase.firestore.CollectionReference.add(Unknown Source:5)
at com.resocoder.firemessageprep.util.FirestoreUtil.sendTextMessage(FirestoreUtil.kt:138)
at com.resocoder.firemessageprep.ChatActivity$onCreate$1$2.onClick(ChatActivity.kt:52)
at android.view.View.performClick(View.java:6256)
at android.view.View$PerformClick.run(View.java:24701)
at android.os.Handler.handleCallback(Handler.java:789)
at android.os.Handler.dispatchMessage(Handler.java:98)
at android.os.Looper.loop(Looper.java:164)
at android.app.ActivityThread.main(ActivityThread.java:6541)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.Zygote$MethodAndArgsCaller.run(Zygote.java:240)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:767)
这没有道理。我知道TextMessage实现的接口(interface)具有isText属性,但这不应该是原因...对吗?
感谢您阅读本文!
最佳答案
代码中的问题是您正在使用名为isText
的字段。在Cloud Firestore中,响应的核心getter是getText()
和NOT getIsText()
。
如果您尝试更改izText
(而不是isText
)中的字段名称,并使用getIzText()
这样的相应getter,则您的代码将可以正常工作。 Firestore从 setter/getter 中删除了is
前缀,这就是您遇到冲突的原因。有关更多信息,您还可以查看此 video 。
如果您决定更改该字段名称,请不要忘记删除旧数据并添加新数据。