Объединение аутентификации Firebase с базой данных в реальном времени - PullRequest
0 голосов
/ 09 апреля 2020

Я создал приложение в Android Studio (Kotlin), которое регистрирует пользователей:

Пользовательский интерфейс

Создан пользователь электронной почты / пароль (( Аутентификация) вместе с соответствующей записью базы данных (База данных в реальном времени):

Структура базы данных

У меня работает процедура входа в систему, и я могу отобразить вошедший в систему адрес электронной почты пользователя на 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: Неразрешенная ссылка на пользователя.

Error, full code above ^

1 Ответ

3 голосов
/ 09 апреля 2020

Когда вы запускаете на этапе входа в систему

mAuth.signInWithEmailAndPassword(email, password)

У него есть обратный вызов, который будет завершен и успешно завершен, когда пользователь вошел в систему, внутри этого обратного вызова вы уже вошли в систему и этот пользователь сейчас соответствует одному уникальному идентификатору пользователя. Вы можете получить доступ к этому идентификатору пользователя, выполнив команду

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 с этими значениями и отправьте эти значения в качестве дополнительного к основному действию, чтобы вы не загружали свой mainactivit y и просто отправив значения из логина

Имейте в виду, что после .addonCompleteListener() результатом будет ваш текущий вошедший в систему пользователь, поэтому отсюда вы можете получить информацию currentUser или идентификатор currentUser

Edit 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

Edit 3

Чтобы изменить цвет, просто измените его с MainActivity

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

Пожалуйста, прочитайте это

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...