Kotlin中RegisterActivity实现用户注册后数据同步至Firestore数据库的问题问询
实现说明
你现有的代码里已经包含了注册成功后写入Firestore的核心逻辑,只需调整部分问题保证逻辑正常运行即可:
- 首先确认你已经完成Firestore的基础配置:在项目级
build.gradle和应用级build.gradle中添加了Firestore相关依赖,且在Firebase控制台中开启了Cloud Firestore服务。 - 原有代码存在两个可优化点:
- 重复绑定了
tv_login的点击事件,属于冗余代码可以删掉一份 - 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
相关产品推荐
相关产品推荐

