簡體   English   中英

將 Firebase 身份驗證與實時數據庫相結合

[英]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

編輯 2

在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 的數據

編輯 3

要更改顏色,只需從 MainActivity 更改它

your_text_view.setTextColor(ContextCompat.getColor(this,R.color.yourColor)

請閱讀

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM