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

Android Kotlin:从Firestore取数据到TextView异常排查与解决

Firestore获取用户数据无法显示到TextView问题排查

问题描述

启动Activity后,原本显示“usuario”的TextView变为空白,无法从Firestore的Generales集合中获取Nombre字段值并展示。

相关代码与配置

Activity代码(Kotlin)

class idcheck1 : AppCompatActivity() {
    companion object {
        internal const val CAMERA_PERMISSION_CODE = 1
        internal const val CAMERA_REQUEST_CODE = 2
        private const val TAG = "IdCheckActivity" // 补充日志TAG
    }

    private lateinit var binding: ActivityIdcheckBinding

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        binding = ActivityIdcheckBinding.inflate(layoutInflater)
        setContentView(binding.root)

        val currentUser = FirebaseAuth.getInstance().currentUser
        if (currentUser == null) {
            binding.usuario.text = "usuario"
            return
        }
        val uid = currentUser.uid

        val rootRef = FirebaseFirestore.getInstance()
        val usersRef = rootRef.collection("Usuarios").document("Info")
            .collection("Generales")
        val uidRef = usersRef.document(uid)
        uidRef.get().addOnSuccessListener { document ->
            if (document != null) {
                binding.usuario.text = document.getString("Nombre")
            } else {
                Log.d(TAG, "No such document")
            }
        }.addOnFailureListener { exception ->
            Log.d(TAG, "get failed with ", exception)
        }
    }
}

布局代码(XML)

<LinearLayout>
    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:fontFamily="@font/poppinsbold"
        android:gravity="center"
        android:text="Hola,"
        android:textColor="@color/colorPrimary"
        android:textSize="30.0sp" />

    <TextView
        android:id="@+id/usuario"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:fontFamily="@font/poppinsbold"
        android:layout_marginStart="10dp"
        android:text="usuario"
        android:textColor="@color/colorPrimary"
        android:textSize="30.0sp" />
</LinearLayout>

Firestore数据结构

数据层级为:

  • 根集合:Usuarios
    • 文档:Info
      • 子集合:Generales
        • 以用户UID命名的文档,包含Nombre字段

依赖配置

implementation 'com.google.firebase:firebase-firestore-ktx:24.2.1'

问题原因与解决办法

1. 文档存在性判断错误

Firestore中,即使目标文档不存在,document对象也不会为null,而是document.exists()返回false。原代码的判断逻辑会导致文档不存在时仍执行赋值,而getString("Nombre")返回null,让TextView变空白。

修复代码:

uidRef.get().addOnSuccessListener { document ->
    if (document.exists()) {
        val nombre = document.getString("Nombre")
        // 字段为空时显示默认文字
        binding.usuario.text = nombre ?: "usuario"
    } else {
        Log.d(TAG, "未找到用户文档")
        binding.usuario.text = "usuario"
    }
}.addOnFailureListener { exception ->
    Log.e(TAG, "获取数据失败", exception)
    // 请求失败时恢复默认文字
    binding.usuario.text = "usuario"
}

2. 用户UID初始化时机错误

原代码在类初始化时直接获取currentUser!!.uid,如果此时用户还未完成认证,会抛出空指针异常,后续代码无法执行,导致TextView可能被意外清空。

修复:
将UID的获取移到onCreate方法内,并添加用户登录状态判断,如修改后的Activity代码所示。

3. Firestore路径或权限问题

  • 确认代码中的集合/文档路径和Firestore后台完全一致(大小写敏感);
  • 检查Firestore安全规则,确保当前登录用户有权限读取Generales集合的文档。例如:
    rules_version = '2';
    service cloud.firestore {
      match /databases/{database}/documents {
        match /Usuarios/Info/Generales/{userId} {
          allow read: if request.auth != null && request.auth.uid == userId;
          allow write: if request.auth != null && request.auth.uid == userId;
        }
      }
    }
    

4. 空字段处理

如果Nombre字段本身为空,getString("Nombre")会返回null,导致TextView空白。添加空值判断,设置默认文字即可避免这种情况。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.22 19:07:35