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的值和Firestoreusers集合下对应文档的ID完全一致,正常使用Firebase Auth的场景下,文档ID就是登录用户的UID。 - 请检查Firebase安全规则是否开放了对应文档的读权限,权限不足也会导致请求失败。
内容的提问来源于stack exchange,提问作者RodParedes
相关产品推荐
相关产品推荐

