Android Studio应用向Firebase发送数据时崩溃如何解决
报错日志如下:
java.lang.RuntimeException: Found conflicting getters for name getText on class androidx.appcompat.widget.AppCompatEditText at com.google.firebase.firestore.util.CustomClassMapper$BeanMapper.(CustomClassMapper.java:629) at com.google.firebase.firestore.util.CustomClassMapper.loadOrCreateBeanMapperForClass(CustomClassMapper.java:377) at com.google.firebase.firestore.util.CustomClassMapper.serialize(CustomClassMapper.java:177) at com.google.firebase.firestore.util.CustomClassMapper.serialize(CustomClassMapper.java:140) at com.google.firebase.firestore.util.CustomClassMapper.serialize(CustomClassMapper.java:104) at com.google.firebase.firestore.util.CustomClassMapper.convertToPlainJavaTypes(CustomClassMapper.java:78) at com.google.firebase.firestore.UserDataReader.convertAndParseDocumentData(UserDataReader.java:231) at com.google.firebase.firestore.UserDataReader.parseSetData(UserDataReader.java:75) at com.google.firebase.firestore.DocumentReference.set(DocumentReference.java:167) at com.google.firebase.firestore.DocumentReference.set(DocumentReference.java:147) at com.example.finalproject3.RegisterScreen$1$1.onComplete(RegisterScreen.java:82) at com.google.android.gms.tasks.zzj.run(Unknown Source) at android.os.Handler.handleCallback(Handler.java:739) at android.os.Handler.dispatchMessage(Handler.java:95) at android.os.Looper.loop(Looper.java:148) at android.app.ActivityThread.main(ActivityThread.java:5417) at java.lang.reflect.Method.invoke(Native Method) at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)
错误触发原因
Firebase Firestore在序列化待写入数据时,会自动扫描目标类的getter方法完成Java对象到JSON结构的转换。本次报错是因为你向set()方法传入的待存储对象中包含了androidx.appcompat.widget.AppCompatEditText控件实例:该控件本身存在多个签名不同的getText方法,Firebase的序列化映射器无法识别正确的调用方法,因此抛出getter冲突异常。
你可以定位到项目中RegisterScreen.java的第82行,此处就是调用Firestore写入数据的代码位置,你传入的对象错误携带了EditText控件实例而非控件的文本内容。
修复步骤
- 提取控件的文本内容而非直接传入控件
不要直接把EditText对象作为字段存入待上传的实体类,先调用如下方法拿到纯文本:
再将String inputContent = yourEditText.getText().toString().trim();inputContent赋值给实体类对应的字符串字段。 - 清理实体类的冗余字段
检查你用于上传Firestore的实体类,不要将任何Android View类型作为成员变量声明。如果有特殊原因需要保留View字段,可以给该字段添加@Exclude注解,Firebase序列化时会自动跳过该字段:@Exclude private AppCompatEditText nameInput; - 验证写入逻辑
修改完成后重新运行写入流程,确认不再携带控件实例即可解决崩溃问题。
内容的提问来源于stack exchange,提问作者Orelvak Orel
相关产品推荐
相关产品推荐

