[英]Combining Firebase Authentication with Realtime Database
我在 Android Studio (Kotlin) 中創建了一個注冊用戶的應用程序:
創建電子郵件/密碼用戶(身份驗證)以及相應的數據庫記錄(實時數據庫):
我的登錄程序正常工作,我能夠在 MainActivity 上顯示登錄用戶的 email 地址,但是,我不知道如何顯示用戶名和最喜歡的顏色(來自數據庫)。
任何人都可以幫忙嗎?
在此先感謝您的時間。
注冊活動.kt
class RegisterActivity : AppCompatActivity() {
private lateinit var mAuth : FirebaseAuth
private lateinit var viewModel: UserViewModel
public val USER: String = "user"
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_register)
mAuth = FirebaseAuth.getInstance()
viewModel = ViewModelProvider(this).get(UserViewModel::class.java)
register_button.setOnClickListener {
val email = register_email.text.toString().trim()
val password = register_password.text.toString().trim()
val name = register_name.text.toString().trim()
val colour = register_colour.text.toString().trim()
mAuth.createUserWithEmailAndPassword(email, password)
val user = User()
user.email = email
user.name = name
user.colour = colour
viewModel.addUser(user)
}
}
}
登錄活動.kt
class LoginActivity : AppCompatActivity() {
private lateinit var mAuth : FirebaseAuth
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_login)
mAuth = FirebaseAuth.getInstance()
login_button.setOnClickListener {
val email = login_email.text.toString().trim()
val password = login_password.text.toString().trim()
mAuth.signInWithEmailAndPassword(email, password)
.addOnCompleteListener(this) { task ->
if (task.isSuccessful) {
//Login Success
val intent = Intent (this, MainActivity::class.java).apply {
flags = Intent.FLAG_ACTIVITY_NEW_TASK or
Intent.FLAG_ACTIVITY_CLEAR_TASK
}
startActivity(intent)
}else{
//Login Failure
task.exception?.message?.let {
toast(it)
}
}
}
}
}
}
MainActivity.kt (顯示用戶詳細信息)
class MainActivity : AppCompatActivity() {
private val currentUser = FirebaseAuth.getInstance().currentUser
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
currentUser?.let { user ->
main_email.setText(user.email)
main_name.setText("Don't Know")
main_colour.setText("Don't Know")
}
}
}
編輯 3
登錄活動.kt
class LoginActivity : AppCompatActivity() {
private lateinit var mAuth : FirebaseAuth
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_login)
mAuth = FirebaseAuth.getInstance()
login_button.setOnClickListener {
val email = login_email.text.toString().trim()
val password = login_password.text.toString().trim()
loginUser (email, password)
}
}
private fun loginUser(email: String, password: String) {
mAuth.signInWithEmailAndPassword(email, password)
.addOnCompleteListener(this) { task ->
if (task.isSuccessful) {
//Login Success
val intent = Intent(this,MainActivity::class.java)
intent.putExtra("username",user.displayName)
intent.putExtra("email",user.email)
startActivity(intent)
}else{
//Login Failure
task.exception?.message?.let {
toast(it)
}
}
}
}
override fun onStart() {
super.onStart()
mAuth.currentUser?.let {
login()
}
}
}
MainActivity.kt
class MainActivity : AppCompatActivity() {
//I have commented out the line below because it may not be required...
// private val currentUser = FirebaseAuth.getInstance().currentUser
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
//I have commented out the lines below because they may not be required...
//currentUser?.let { user ->
//main_email.setText(user.email)
//main_name.setText("Don't Know")
//main_colour.setText("Don't Know")
//}
}
}
錯誤 1:putExtra 上的重載分辨率不明確
錯誤 2:未解決的用戶參考。
當您在登錄階段啟動時
mAuth.signInWithEmailAndPassword(email, password)
它有一個回調將在用戶登錄時完成並成功,在該回調中,您已經登錄並且該用戶現在對應一個唯一的用戶 ID,您可以通過執行訪問該用戶 ID
val user = FirebaseAuth().getInstance().currentUser.uid
然后,您可以在此處獲取該用戶數據並將其作為額外或捆綁傳遞給您的 MainActivity,因此登錄過程將花費時間來記錄用戶,獲取其數據並將其發送到 MainActivity,這樣您就不會延遲用戶在您的 MainActivity 中的任何時間
一旦成功的回調啟動,您可以看到用戶已創建,然后在 Firebase 控制台中,您可以在身份驗證選項卡中檢查該用戶
mAuth.signInWithEmailAndPassword(email, password)
.addOnCompleteListener(this) { task ->
if (task.isSuccessful) {
//Login Success, here you can get currentUser
val user = FirebaseAuth().getInstance().currentUser
login(user.displayName,user.email)
}else{
//Login Failure
task.exception?.message?.let {
toast(it)
}
}
}
然后,只需將這兩個參數添加到 login() 方法,然后使用這些值執行 putExtra 並將這些值作為額外的值發送到主活動,這樣您就不會在主活動中獲取,而只是從登錄中發送值
請記住,在.addonCompleteListener()
之后,結果是您當前登錄的用戶,因此您可以從這里獲取 currentUser 信息或 currentUser id
在onComplete里面,只需將數據傳給MainActivity
val intent = Intent(this,MainActivity::class.java)
intent.putExtra("username",user.displayName)
intent.putExtra("email",user.email)
startActivity(intent)
然后在你的 MainActivity 中得到這個額外的
val extras = getIntent().extras
val userName: String?
val email: String?
if (extras != null) {
userName = extras.getString("userame")
email = extras.getString("email")
}
然后你已經有了登錄到 MainActivity 的數據
要更改顏色,只需從 MainActivity 更改它
your_text_view.setTextColor(ContextCompat.getColor(this,R.color.yourColor)
請閱讀此
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.