将Firebase身份验证与实时数据库相结合

时间:2020-04-09 11:44:28

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

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

User Interface

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

Datbase Structure

我正在执行登录过程,并且能够在MainActivity,BUT上显示已登录用户的电子邮件地址,但我不知道如何显示用户名和喜欢的颜色(来自数据库)。

有人可以帮忙吗?

提前感谢您的时间。

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:用户上未解析的引用。

Error, full code above ^

1 个答案:

答案 0 :(得分:3)

在登录阶段启动时

mAuth.signInWithEmailAndPassword(email, password)

它具有一个回调,该回调将在用户登录后完成并成功,在该回调中,您已经登录并且该用户现在对应一个唯一的用户ID,您可以通过执行以下操作访问该用户ID < / p>

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并将这些值作为额外的值发送至main活动,因此您无需获取mainactivity,而只是从中发送值登录

请记住,在.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)

请阅读this