使用Kotlin在Firebase中无法创建新用户的问题求助
问题描述
我是Android Studio新手,跟着教程制作注册登录页面,代码完全复刻,但点击注册按钮无反应,Firebase未创建新用户。手动在Firebase官网创建的账号可正常登录,已启用邮箱密码认证且密码长度合规,搜索解决方案未果,附上注册Activity的Kotlin代码及build.gradle代码,恳请帮助。
相关代码
注册Activity Kotlin代码
package com.example.signinlogin import android.content.Intent import android.os.Bundle import android.widget.Toast import androidx.appcompat.app.AppCompatActivity import com.example.signinlogin.databinding.ActivitySignupBinding import com.google.firebase.auth.FirebaseAuth class signupactivity : AppCompatActivity() { private lateinit var binding: ActivitySignupBinding private lateinit var firebaseAuth: FirebaseAuth override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) binding = ActivitySignupBinding.inflate(layoutInflater) setContentView(binding.root) binding.signInOption.setOnClickListener { val intent = Intent(this,MainActivity::class.java) startActivity(intent) } val email = binding.emailId.text.toString() val passwordsignup = binding.passwordId.text.toString() val renterpassword = binding.retypepasswordId.text.toString() binding.submitButton.setOnClickListener { if(email.isNotEmpty() && passwordsignup.isNotEmpty() && renterpassword.isNotEmpty()){ if(passwordsignup == renterpassword){ firebaseAuth.createUserWithEmailAndPassword(email,passwordsignup).addOnCompleteListener { if(it.isComplete) { val intent = Intent(this,MainActivity::class.java) startActivity(intent) finish() } else { Toast.makeText( this,it.exception.toString(), Toast.LENGTH_SHORT).show() } } } else { Toast.makeText( this, "No fields should be left empty",Toast.LENGTH_SHORT).show() } } } } }
build.gradle代码
plugins { id 'com.android.application' id 'org.jetbrains.kotlin.android' id 'kotlin-android' id 'com.google.gms.google-services' id 'com.google.firebase.crashlytics' id 'kotlin-kapt' } android { namespace 'com.example.signinlogin' compileSdk 33 defaultConfig { applicationId "com.example.signinlogin" minSdk 23 targetSdk 33 versionCode 1 versionName "1.0" testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" } buildTypes { release { minifyEnabled false proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro' } } buildFeatures { dataBinding = true viewBinding = true } compileOptions { sourceCompatibility JavaVersion.VERSION_1_8 targetCompatibility JavaVersion.VERSION_1_8 } kotlinOptions { jvmTarget = '1.8' } } dependencies { implementation 'androidx.core:core-ktx:1.10.0' implementation 'androidx.appcompat:appcompat:1.6.1' implementation 'com.google.android.material:material:1.8.0' implementation 'androidx.constraintlayout:constraintlayout:2.1.4' implementation 'com.google.firebase:firebase-auth-ktx:22.0.0' implementation 'com.google.firebase:firebase-crashlytics:18.3.7' implementation 'com.google.firebase:firebase-analytics:21.2.2' testImplementation 'junit:junit:4.13.2' androidTestImplementation 'androidx.test.ext:junit:1.1.5' androidTestImplementation 'androidx.test.espresso:espresso-core:3.5.1' }
解决方案
你的代码存在几个关键问题,逐一修复即可:
- FirebaseAuth实例未初始化:声明了
lateinit var firebaseAuth: FirebaseAuth但从未赋值,必须在onCreate中添加firebaseAuth = FirebaseAuth.getInstance()来初始化实例。 - 输入值获取时机错误:在
onCreate时就获取输入框文本,此时用户还没输入内容,所有值都是空字符串。必须把输入值的获取逻辑放到按钮点击事件内部,确保获取的是用户点击按钮时的最新输入。 - 逻辑提示文本错误:密码不匹配时提示“No fields should be left empty”,会误导用户,应改成提示“两次输入的密码不一致”。
- 完成监听判断错误:
it.isComplete仅表示任务已完成,不管成功失败都会返回true,应该用it.isSuccessful判断用户是否创建成功。
修复后的完整代码如下:
package com.example.signinlogin import android.content.Intent import android.os.Bundle import android.widget.Toast import androidx.appcompat.app.AppCompatActivity import com.example.signinlogin.databinding.ActivitySignupBinding import com.google.firebase.auth.FirebaseAuth class signupactivity : AppCompatActivity() { private lateinit var binding: ActivitySignupBinding private lateinit var firebaseAuth: FirebaseAuth override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) binding = ActivitySignupBinding.inflate(layoutInflater) setContentView(binding.root) // 初始化FirebaseAuth实例 firebaseAuth = FirebaseAuth.getInstance() binding.signInOption.setOnClickListener { val intent = Intent(this, MainActivity::class.java) startActivity(intent) } binding.submitButton.setOnClickListener { // 在点击按钮时才获取输入框内容 val email = binding.emailId.text.toString().trim() val passwordsignup = binding.passwordId.text.toString().trim() val renterpassword = binding.retypepasswordId.text.toString().trim() if (email.isNotEmpty() && passwordsignup.isNotEmpty() && renterpassword.isNotEmpty()) { if (passwordsignup == renterpassword) { firebaseAuth.createUserWithEmailAndPassword(email, passwordsignup) .addOnCompleteListener { task -> if (task.isSuccessful) { // 用户创建成功,跳转登录页 val intent = Intent(this, MainActivity::class.java) startActivity(intent) finish() } else { // 显示错误信息 Toast.makeText(this, task.exception?.message ?: "注册失败", Toast.LENGTH_SHORT).show() } } } else { Toast.makeText(this, "两次输入的密码不一致", Toast.LENGTH_SHORT).show() } } else { Toast.makeText(this, "请填写所有必填字段", Toast.LENGTH_SHORT).show() } } } }
内容的提问来源于stack exchange,提问作者Janardhan Reddy
相关产品推荐
相关产品推荐

