Данные пользователя не сохраняются в Firebase (имя пользователя, имя, фамилия) - PullRequest
0 голосов
/ 19 февраля 2020

Я пытаюсь сохранить данные в моей базе данных Firebase, но приложение вылетает, когда я вызываю функцию saveUserToFirebaseDatabase (). Функция executeRegister () прекрасно работает, в которой электронная почта и пароль хранятся с использованием FirebaseAuth, но когда я вызываю executeRegister (), а затем saveUserToFirebaseDatabase () прямо под ним, executeRegister () не выполняется полностью. executeRegister () предполагает создание тега log.d, который сообщает uid и успешно хранит электронную почту и пароль. Он делает это, но когда я вызываю saveUserToFirebaseDatabase () в executeRegister () в функции onCreate, он не регистрирует uid, как это было без saveUserToFirebaseDatabase (). Вместо этого в executeRegister () Log отображаются имя пользователя и passowrd, а затем переходит к saveUserToFirebaseDatabase (), в котором отображаются имя пользователя, имя и фамилия из предыдущих действий, которые пользователь должен был ввести при регистрации учетной записи. Тогда это терпит крах. Вот мой код Я хочу иметь возможность вызвать executeRegister (), затем saveUserToFirebaseDatabase (), чтобы сохранить электронную почту и пароль пользователя с помощью FirebaseAuth, а затем сохранить другую информацию пользователя в базе данных с помощью saveUserToFirebaseDatabase ().

class Password_Activity : AppCompatActivity() {

    lateinit var editPasswordText: EditText
    lateinit var editConfirmPasswordText: EditText
    lateinit var btnOpenActivity: Button

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_password)

        editPasswordText = findViewById(R.id.edit_password)
        editConfirmPasswordText = findViewById(R.id.edit_confirm_password)
        btnOpenActivity = findViewById(R.id.password_continue_btn)




//        btnOpenActivity.isEnabled=false

        val textWatcher = object : TextWatcher {
            override fun afterTextChanged(s: Editable?) {

            }

            override fun beforeTextChanged(s: CharSequence?, start: Int, count: Int, after: Int) {

            }

            override fun onTextChanged(s: CharSequence?, start: Int, before: Int, count: Int) {
                var passwordinput: String = editPasswordText.text.toString().trim()
                var confirmpasswordinput: String = editConfirmPasswordText.text.toString().trim()
                btnOpenActivity.isEnabled = passwordinput.isNotEmpty() && confirmpasswordinput.isNotEmpty()


            }
        }


        editPasswordText.addTextChangedListener(textWatcher)
        editConfirmPasswordText.addTextChangedListener(textWatcher)


//        var intent = intent
//        val username = intent.getStringExtra("username")
//        val firstname = intent.getStringExtra("firstname")
//        val lastname = intent.getStringExtra("lastname")
//        val emailaddress = intent.getStringExtra("emailaddress")




        val btnOpenActivity: Button = findViewById(R.id.password_continue_btn)
        btnOpenActivity.setOnClickListener {


            performRegister()
            saveUserToFirebaseDatabase()



//            val intent = Intent(this, Main2Activity_welcome_after_signup_dashboard::class.java)
//            startActivity(intent)
//            overridePendingTransition(R.anim.slide_in_right,R.anim.slide_out_left)
        }
    }
// Save user's email and password 
    private fun performRegister(){
        var intent = intent
        val email = intent.getStringExtra("email")
        val password = editPasswordText.text.toString().trim()

        if (email.isEmpty() && password.isEmpty()) {
            Toast.makeText(this, "Please enter email and password", Toast.LENGTH_SHORT).show()
            return
        }

        Log.d("SignUpActivity","Email is "+ email)
        Log.d("SignUpActivity","Password is $password")

        // Initialize Firebase Auth
        FirebaseAuth.getInstance().createUserWithEmailAndPassword(email, password)
            .addOnCompleteListener {
                if (!it.isSuccessful) {
                    Log.d("SignUp", "Account creation unsuccessful")
                    return@addOnCompleteListener
                }

                //else if successful
                Log.d("SignUp", "Successfully created user with uid: ${it.result?.user?.uid}")
            }
            .addOnFailureListener {
                Log.d("SignUp", "Failed to create user: ${it.message}")
            }

    }
// Save user's username, first name, and last name to database
    private fun saveUserToFirebaseDatabase(){
        var intent = intent
        val username = intent.getStringExtra("username")
        val firstname = intent.getStringExtra("firstname")
        val lastname = intent.getStringExtra("lastname")
        Log.d("Signup","Storing user information in password activity: $username, $firstname, $lastname")

        val uid = FirebaseAuth.getInstance().uid ?: ""
        val ref = FirebaseDatabase.getInstance().getReference("/users/$uid")

        val user = User(uid, username, firstname, lastname)
        ref.setValue(user)
            .addOnSuccessListener {
                Log.d("Signup","We saved the user to Firebase Database")
            }
            .addOnFailureListener {
                Log.d("Signup", "Failed to save user to Firebase Database")
                return@addOnFailureListener
            }

    }


//Animation for back button
    override fun finish() {
        super.finish()
        overridePendingTransition(R.anim.slide_in_left,R.anim.slide_out_right)
    }
}

data class User(val uid: String, val username: String, val firstname: String, val lastname: String)

1 Ответ

0 голосов
/ 19 февраля 2020

Ваш performRegister звонок происходит aysn c в фоновом режиме. Вот почему saveUserToFirebaseDatabase вызывается до его завершения. Вместо этого просто вызовите его, когда performRegister завершено в onCompleteListener.

Измените это:

btnOpenActivity.setOnClickListener {
    performRegister()
    saveUserToFirebaseDatabase()
}

На:

btnOpenActivity.setOnClickListener {
    performRegister()
}

и добавьте saveUserToFirebaseDatabase() до:

      .addOnCompleteListener {
                if (!it.isSuccessful) {
                    Log.d("SignUp", "Account creation unsuccessful")
                    return@addOnCompleteListener
                }

                //else if successful
                saveUserToFirebaseDatabase()
                Log.d("SignUp", "Successfully created user with uid: ${it.result?.user?.uid}")
            }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...