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字段
- 以用户UID命名的文档,包含
- 子集合:
- 文档:
依赖配置
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
相关产品推荐
相关产品推荐

