Firebase注册时第二个addOnCompleteListener未触发,用户已存入数据库
问题分析与解决方案
问题现象
- 通过Firebase Auth成功创建用户账号
- 用户数据已成功写入Firebase Realtime Database
setValue()对应的addOnCompleteListener代码块完全未执行- 无任何报错信息
核心原因
从你提供的代码来看,最可能的问题是Lambda表达式的语法错误:你把Lambda参数的箭头符号->写成了-,导致系统无法正确识别监听器逻辑,自然不会执行对应的代码块。
另外,代码最后一行的progressBar.visibility = View.GONE写在异步操作外部,会在发起请求后立即执行,无法实现“等待操作完成再隐藏进度条”的预期效果。
修正后的代码
mAuth?.createUserWithEmailAndPassword(email, password) ?.addOnCompleteListener { task -> if (task.isSuccessful) { val currentUser = FirebaseAuth.getInstance().currentUser ?: run { showToast("获取用户信息失败") progressBar.visibility = View.GONE return@addOnCompleteListener } val user = User(fullName, age, email) FirebaseDatabase.getInstance().getReference("user") .child(currentUser.uid) .setValue(user) .addOnCompleteListener { childTask -> if (childTask.isSuccessful) { findNavController().navigate(R.id.action_registrationWindow_to_loginWindow) showToast("用户注册成功") } else { showToast("注册失败,请重试!") } progressBar.visibility = View.GONE } } else { showToast("注册失败,请重试!") progressBar.visibility = View.GONE } }
关键修正点
- 修正Lambda箭头符号:将
task -改为task ->,childTask -改为childTask ->,确保监听器能被正确注册和触发。 - 优化用户获取逻辑:增加空安全判断,避免
currentUser!!的空指针风险。 - 统一进度条隐藏时机:将
progressBar.visibility = View.GONE移到所有异步操作的完成回调中,确保只有操作结束后才隐藏进度条。
额外建议
- 可以添加
addOnFailureListener来捕获数据库操作的异常,方便排查潜在问题:.setValue(user) .addOnFailureListener { e -> Log.e("Registration", "写入数据库失败", e) showToast("写入数据失败:${e.message}") }
内容的提问来源于stack exchange,提问作者Uladzislau Krukouski
相关产品推荐
相关产品推荐

