Firebase手机号认证成功后ValueEventListener未触发问题求解
解决方案
- 补全错误回调定位根因
你当前onCancelled方法为空实现,权限拒绝、网络异常、配置错误等问题触发该回调时无任何提示,补全日志即可快速定位问题:
override fun onCancelled(error: DatabaseError) { Log.d("FIREBASE_ERR", "数据库请求失败:${error.message},错误码:${error.code}") }
- 检查Realtime Database安全规则
默认安全规则仅测试模式有效期内可读写,过期后会拦截所有未授权请求,建议先将users节点配置为同UID认证用户可读写验证:
{ "rules": { "users": { "$uid": { ".read": "$uid === auth.uid", ".write": "$uid === auth.uid" } } } }
- 修复空指针异常风险
手机号新注册的用户默认displayName字段为null,代码中直接使用!!强转在首次注册时会抛出空指针导致逻辑中断,建议补充默认值:
contactInfoMap["name"] = currentUser.displayName ?: "新用户"
- 核对数据库实例配置
如果创建Realtime Database时选择了美国区以外的节点,必须在getInstance时传入完整的数据库URL,否则无法连接到正确的实例:
// 替换为你控制台显示的完整数据库URL val db = FirebaseDatabase.getInstance("https://你的项目id-default-rtdb.asia-southeast1.firebasedatabase.app/") val databaseReference = db.reference.child("users").child(currentUser.uid)
- 可选逻辑优化
无需先读再判断节点是否存在再写入,可直接写入数据并监听结果,减少不必要的读请求:
val contactInfoMap = hashMapOf<String,Any>() contactInfoMap["name"] = currentUser.displayName ?: "新用户" contactInfoMap["phone"] = currentUser.phoneNumber!! databaseReference.setValue(contactInfoMap).addOnCompleteListener { writeTask -> if (writeTask.isSuccessful) { userIsLoggedIn() } else { Log.d("WRITE_ERR", "写入失败:${writeTask.exception?.message}") } }
内容的提问来源于stack exchange,提问作者Taki
相关产品推荐
相关产品推荐

