You need to enable JavaScript to run this app. Firebase手机号认证成功后ValueEventListener未触发问题求解
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.18 23:36:11