You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Firebase Auth邮箱密码注册失败排查及代码修复请求

Firebase Auth邮箱密码注册失败排查与修复

原代码存在的核心问题

  • 错误信息模糊:仅提示“账户注册失败”,完全无法获取Firebase返回的具体错误原因(如邮箱格式无效、邮箱已被注册、项目权限配置错误等)
  • 缺少邮箱格式校验:仅检查邮箱输入非空,未验证格式合法性,会直接触发Firebase的注册失败回调
  • 生命周期风险:使用requireActivity()作为OnCompleteListener的上下文,可能引发内存泄漏或Fragment销毁后回调异常

修复后的完整代码

class EmailSignUpFragment : Fragment() {
    private lateinit var binding: FragmentEmailSignUpBinding
    private lateinit var mAuth: FirebaseAuth
    private lateinit var homeViewModel: HomeViewModel
    
    override fun onCreateView(
        inflater: LayoutInflater, container: ViewGroup?,
        savedInstanceState: Bundle?
    ): View {
        binding = FragmentEmailSignUpBinding.inflate(layoutInflater)
        return binding.root
    }

    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
        super.onViewCreated(view, savedInstanceState)
        mAuth = FirebaseAuth.getInstance()
        homeViewModel = ViewModelProvider(requireActivity())[HomeViewModel::class.java]
        setupSignUpListener()
    }

    private fun setupSignUpListener() {
        binding.btnEmailSignUp.setOnClickListener {
            val name = binding.editNameTxt.text.toString().trim()
            val email = binding.editEmailTxt.text.toString().trim()
            val password = binding.editPasswordTxt.text.toString().trim()

            // 输入验证优化
            when {
                name.isEmpty() -> showToast("请输入姓名")
                email.isEmpty() -> showToast("请输入邮箱地址")
                !isEmailValid(email) -> showToast("请输入合法的邮箱格式")
                password.isEmpty() -> showToast("请输入密码")
                password.length < 8 -> showToast("密码长度必须大于8位")
                else -> performSignUp(name, email, password)
            }
        }
    }

    private fun isEmailValid(email: String): Boolean {
        val emailRegex = "^[A-Za-z0-9+_.-]+@[A-Za-z0-9.-]+$"
        return email.matches(emailRegex.toRegex())
    }

    private fun performSignUp(name: String, email: String, password: String) {
        mAuth.createUserWithEmailAndPassword(email, password)
            .addOnCompleteListener(viewLifecycleOwner) { task ->
                if (task.isSuccessful) {
                    val currentUser = mAuth.currentUser ?: return@addOnCompleteListener
                    homeViewModel.setUserData(currentUser.uid, name, email, "")
                    
                    // 导航到首页(建议使用Navigation Component替代手动Fragment切换)
                    val home = HomeFragment()
                    val navigationUseCase = switchFragmentUsecase(
                        requireActivity().supportFragmentManager,
                        R.id.logFragment
                    )
                    navigationUseCase.navigateToFragment(home)
                } else {
                    // 获取具体错误信息
                    val errorMsg = when (task.exception) {
                        is FirebaseAuthUserCollisionException -> "该邮箱已被注册"
                        is FirebaseAuthInvalidCredentialsException -> "邮箱格式无效或密码不符合要求"
                        is FirebaseAuthWeakPasswordException -> "密码强度不足"
                        else -> task.exception?.message ?: "账户注册失败"
                    }
                    showToast(errorMsg)
                }
            }
    }

    private fun showToast(message: String) {
        Toast.makeText(requireContext(), message, Toast.LENGTH_SHORT).show()
    }
}

关键修改说明

  1. 输入验证优化:

    • 添加邮箱格式正则校验,提前拦截无效格式的请求
    • 使用when替代嵌套if,代码更简洁易读
    • 对输入内容做trim()处理,避免前后空格导致的验证失败
  2. 错误信息具体化:

    • 根据Firebase抛出的异常类型,返回针对性的错误提示
    • 直接获取异常的message,精准定位问题
  3. 生命周期安全:

    • 使用viewLifecycleOwner作为Listener的上下文,确保Fragment销毁后不会触发无效回调,避免内存泄漏
  4. 空安全优化:

    • 注册成功后先判断currentUser是否为空,避免空指针异常

内容的提问来源于stack exchange,提问作者Lakshay Kadam

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.26 07:03:23