Невозможно получить текущего пользователя firebase в kotlin - PullRequest
1 голос
/ 28 мая 2020

Я интегрирую FirebaseAuth в приложение Android, которое я создаю. Я успешно интегрировал firebase в приложение, добавив SDK, загрузив и добавив файл google-services. json.

Проблема возникает, когда я пытаюсь зарегистрировать нового пользователя. Пользователь добавляется в консоль firebase, но я не могу получить зарегистрированного пользователя, чтобы обновить имя. Это код из фрагмента, в котором я его использую.

requireActivity().let {
    val user = authenticationService.signUpWithEmailAndPassword(email, password)

    user?.let {
            authenticationService.updateUser(it, name)
            navigationService.openHomeScreen()//open next creen
    }
}

функция регистрации в AuthenticationService

fun signUpWithEmailAndPassword(email: String, password: String): FirebaseUser? {
    signOutCurrentUser()
     firebaseAuth.createUserWithEmailAndPassword(email, password)
    return firebaseAuth.currentUser
}

функция обновления пользователя

fun updateUser(user: FirebaseUser?, name: String) {
    val profileUpdates = UserProfileChangeRequest.Builder().apply {
        displayName = name
    }.build()
    user?.updateProfile(profileUpdates)?.addOnCompleteListener { task ->
        if (task.isSuccessful) {
            Timber.d("User profile updated.")
        }
    }
}

функция выхода текущего пользователя

private fun signOutCurrentUser() {
    firebaseAuth.currentUser?.let {
        firebaseAuth.signOut()
    }
}

Проблема в том, что пользователь успешно добавлен , но firebaseAuth.currentUser всегда возвращает null.

Вещи, которые я пробовал:

  • Добавление authStateListener
  • Добавление onSuccessListener
  • Добавление onCompleteListener

Пожалуйста, помогите брату

1 Ответ

1 голос
/ 28 мая 2020

Создание пользователя в Firebase - это (как и большинство вызовов с использованием облачных API-интерфейсов) асинхронная операция, для завершения которой может потребоваться время. К моменту запуска вашего кода return firebaseAuth.currentUser создание пользователя еще не завершено.

Если вы просто запускаете код в одном блоке с обработчиком завершения, вы увидите, что он работает нормально :

firebaseAuth.createUserWithEmailAndPassword(email, password)
  .addOnCompleteListener(this) { task ->
    if (task.isSuccessful) {
        val user = auth.currentUser

        val profileUpdates = UserProfileChangeRequest.Builder().apply {
            displayName = name
        }.build()
        user?.updateProfile(profileUpdates)?.addOnCompleteListener { task ->
            if (task.isSuccessful) {
                Timber.d("User profile updated.")
            }
        }
    } else {
        // If sign in fails, display a message to the user.
        Log.w(TAG, "createUserWithEmail:failure", task.exception)
        Toast.makeText(baseContext, "Authentication failed.",
                Toast.LENGTH_SHORT).show()
        updateUI(null)
    }

    // ...
  }

См. Также:

...