android - 无法在 kotlin 中获取 firebase 当前用户

标签 android firebase kotlin firebase-authentication

我正在将 FirebaseAuth 集成到我正在构建的 Android 应用程序中。通过添加 SDK、下载和添加 google-services.json 文件,我已成功将 firebase 集成到应用程序中。

当我尝试注册新用户时出现问题。用户被添加到 firebase 控制台,但我无法检索登录用户来更新名称。这是我正在使用它的 fragment 中的代码。

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

  • 请大哥帮忙

    最佳答案

    在 Firebase 中创建用户(与大多数涉及基于云的 API 的调用一样)是一种异步操作,可能需要一些时间才能完成。到您的 return firebaseAuth.currentUser 时代码运行,用户创建尚未完成。

    如果您只是使用完成处理程序在单个 block 中运行代码,您会发现它工作正常:

    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)
        }
    
        // ...
      }
    

    另见:
  • getContactsFromFirebase() method return an empty list
  • Firebase retrieve data Null outside method
  • Retrieve String out of addValueEventListener Firebase
  • Setting Singleton property value in Firebase Listener (它显示了使用信号量来制作代码块,但是当我上次尝试它时它在 Android 上不起作用)。
  • 关于android - 无法在 kotlin 中获取 firebase 当前用户,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62054762/

    相关文章:

    android - SecurityException 权限拒绝 MediaProvider READ_EXTERNAL_STORAGE

    javascript - Firebase 如何添加一个集合和实际名称作为键

    java - Kotlin Jackson Mapper 将 String 反序列化为 HashMap<String, Any> 而不是类型

    android - 在 TextView 上设置文本时,在屏幕上显示文本的时间太长

    android - Java.IO.File 到 C# 中的 System.IO.Stream?

    android - iOS 相当于 View.GONE

    javascript - 将默认图像上传到 Firebase Storage

    javascript - Chrome 扩展程序中的 Firebase UI : signInSuccess never called

    Android Kotlin 子级 onClick 会阻塞父级 OnTouch

    android - Android 中的嵌套 fragment 不好吗?