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

Kotlin中RegisterActivity实现用户注册后数据同步至Firestore数据库的问题问询

实现说明

你现有的代码里已经包含了注册成功后写入Firestore的核心逻辑,只需调整部分问题保证逻辑正常运行即可:

  • 首先确认你已经完成Firestore的基础配置:在项目级build.gradle和应用级build.gradle中添加了Firestore相关依赖,且在Firebase控制台中开启了Cloud Firestore服务。
  • 原有代码存在两个可优化点:
    1. 重复绑定了tv_login的点击事件,属于冗余代码可以删掉一份
    2. Firestore写入操作是异步执行的,原有逻辑没等写入结果返回就直接跳转页面,即使写入失败用户也无法感知

如果测试阶段写入失败,可以先检查Firebase控制台的安全规则,临时替换为以下规则测试:

rules_version = '2';
service cloud.firestore {
  match /databases/{database}/documents {
    match /{document=**} {
      allow read, write: if request.auth != null;
    }
  }
}

注意:正式上线前需要调整Firestore安全规则,避免未授权访问。


修正后的完整代码

class RegisterActivity : AppCompatActivity() {

    private val mailAuth = FirebaseAuth.getInstance()

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_register)

        // 去掉重复的点击事件,只保留一份
        findViewById<TextView>(R.id.tv_login).setOnClickListener {
            startActivity(Intent(this@RegisterActivity, LoginActivity::class.java))
            finish()
        }

        findViewById<Button>(R.id.btn_register).setOnClickListener {
            val email = findViewById<EditText>(R.id.et_register_email).text.toString().trim { it <= ' ' }
            val password = findViewById<EditText>(R.id.et_register_password).text.toString().trim { it <= ' ' }
            when {
                email.isEmpty() -> {
                    Toast.makeText(this@RegisterActivity, "请输入邮箱", Toast.LENGTH_SHORT).show()
                }
                password.isEmpty() -> {
                    Toast.makeText(this@RegisterActivity, "请输入密码", Toast.LENGTH_SHORT).show()
                }
                else -> {
                    // 创建Firebase Auth用户
                    mailAuth.createUserWithEmailAndPassword(email, password)
                        .addOnCompleteListener { authTask ->
                            if (authTask.isSuccessful) {
                                val currentUser = authTask.result?.user ?: return@addOnCompleteListener
                                // 写入用户数据到Firestore
                                val usersRef = FirebaseFirestore.getInstance().collection("users")
                                val userMap = mapOf(
                                    "uid" to currentUser.uid,
                                    "email" to email
                                )
                                usersRef.document(currentUser.uid).set(userMap)
                                    .addOnCompleteListener { firestoreTask ->
                                        if (firestoreTask.isSuccessful) {
                                            Log.d("RegisterActivity", "用户数据写入成功")
                                            // 写入成功后再跳转页面
                                            val intent = Intent(this@RegisterActivity, NavigationActivity::class.java)
                                            intent.flags = Intent.FLAG_ACTIVITY_NEW_TASK or Intent.FLAG_ACTIVITY_CLEAR_TASK
                                            intent.putExtra("user_id", currentUser.uid)
                                            intent.putExtra("email_id", email)
                                            startActivity(intent)
                                            finish()
                                        } else {
                                            val errorMsg = firestoreTask.exception?.message ?: "用户数据写入失败"
                                            Log.e("RegisterActivity", errorMsg)
                                            Toast.makeText(this@RegisterActivity, errorMsg, Toast.LENGTH_SHORT).show()
                                            // 写入失败可以删除已经创建的Auth用户,避免脏数据
                                            currentUser.delete()
                                        }
                                    }
                            } else {
                                val errorMsg = authTask.exception?.message ?: "注册失败"
                                Toast.makeText(this@RegisterActivity, errorMsg, Toast.LENGTH_SHORT).show()
                            }
                        }
                }
            }
        }
    }

    override fun onStart() {
        super.onStart()
        isCurrentUser()
    }

    private fun isCurrentUser() {
        mailAuth.currentUser?.let {
            val intent = Intent(applicationContext, NavigationActivity::class.java).apply {
                flags = (Intent.FLAG_ACTIVITY_NEW_TASK or Intent.FLAG_ACTIVITY_CLEAR_TASK)
            }
            startActivity(intent)
        }
    }
}

验证方式

注册操作完成后,打开Firebase控制台进入Cloud Firestore页面,即可看到自动生成的users集合,集合下的文档ID为对应用户的uid,文档内包含你写入的uid和email字段。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.03 01:39:00