You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Kotlin如何在Firestore中获取当前已登录认证用户的所有字段信息

问题根因

你遇到的变量取值异常是Firestore异步调用的时序问题导致的:addOnCompleteListener的回调是异步执行的,你当前代码的执行顺序是1→1a→1b→8→2→3→4...,当你在函数外部访问userName时,回调还没执行,变量还没完成赋值,所以会触发异常。

获取用户全部字段的方案

你不需要逐个调用getString/getLong等方法读取单个字段,直接调用DocumentSnapshot的data属性,就可以拿到该文档所有字段组成的Map<String, Any>对象,键为字段名,值为对应字段的内容。

修复后的代码参考

// 可以改成带回调的方法,拿到用户数据后再执行后续逻辑
fun getFirebaseUserInfo(onResult: (Map<String, Any>?) -> Unit) {
    if (userID == null) {
        println("The userID is null")
        userID = getUserID()
        println("The userId has been assigned and now is: $userID")
    }
    val db = FirebaseFirestore.getInstance()
    val usersRef = db.collection("users")
    usersRef.document(userID.toString()).get().addOnCompleteListener { task ->
        if (task.isSuccessful) {
            val document = task.result
            if (document.exists()) {
                // 直接拿全部字段
                val userAllFields = document.data
                // 也可以单独取用户名
                val userName = document.getString("user")
                println("user is $userName")
                onResult(userAllFields)
            } else {
                Log.d("Error", "This document does not exist")
                onResult(null)
            }
        } else {
            task.exception?.message?.let {
                Log.d(TAG, it)
            }
            onResult(null)
        }
    }
}

// 调用示例,后续需要用到用户信息的逻辑都放到回调里
getFirebaseUserInfo { userFields ->
    userFields?.let {
        // 这里就可以正常访问所有用户字段了
        val userName = it["user"] as? String
        // 执行后续逻辑
    }
}

额外注意项

  • 请确认userID的值和Firestore users集合下对应文档的ID完全一致,正常使用Firebase Auth的场景下,文档ID就是登录用户的UID。
  • 请检查Firebase安全规则是否开放了对应文档的读权限,权限不足也会导致请求失败。

内容的提问来源于stack exchange,提问作者RodParedes

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.25 19:24:09