【问题标题】:Combining Firebase Authentication with Realtime Database将 Firebase 身份验证与实时数据库结合使用
【发布时间】:2020-07-22 00:40:22
【问题描述】:

我在 Android Studio (Kotlin) 中创建了一个注册用户的应用:

User Interface

创建电子邮件/密码用户(身份验证)以及相应的数据库记录(实时数据库):

Datbase Structure

我的登录程序正在运行,我可以在 MainActivity 上显示登录用户的电子邮件地址,但是,我不知道如何显示用户的姓名和最喜欢的颜色(来自数据库)。

谁能帮忙?

提前感谢您的宝贵时间。

RegisterActivity.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)

        }
    }
}

LoginActivity.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

LoginActivity.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:未解决的用户参考。

【问题讨论】:

    标签: android firebase kotlin firebase-realtime-database firebase-authentication


    【解决方案1】:

    当您在登录阶段启动时

    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 中获取这个 extras

     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)
    

    请阅读this

    【讨论】:

    • 谢谢 Gaston,您能否再次检查我的 LoginActivity 代码(已编辑)。我添加了一个 OnCompleteListener。这看起来正确吗?另外,你确定这也会读取数据库记录吗?
    • 请不要回复。我再次编辑我的帖子。谢谢
    • 好的,请再检查一次。
    • 谢谢,请您再检查一下我的登录方法,因为 login() 只是重定向。而不是使用 login() 我放了我的实际代码。如果可以请修改您的登录方法,并告诉我如何在 MainActivity 上显示名称和颜色(我也包含此代码)
    • 现在已编辑,检查一下,您应该熟悉捆绑和附加功能,以处理来自一项活动和另一项活动的数据
    猜你喜欢
    • 2018-05-18
    • 2017-12-26
    • 1970-01-01
    • 2019-06-28
    • 1970-01-01
    • 2021-01-22
    • 2018-01-28
    • 2019-12-08
    • 2019-05-05
    相关资源
    最近更新 更多