Android实现管理员/用户双身份自动登录及代码崩溃修复咨询
问题修复方案
核心问题根因
- 跳转逻辑错误:你写的
getCurrentUserID()和getCurrentUserID1()两个方法逻辑完全一致,只要用户通过FirebaseAuth登录,两个方法都会返回相同的非空UID,判断条件永远命中第一个分支,所有登录用户都会跳转到买家面板,完全无法区分角色。 - 崩溃问题:空指针异常出现在
getUserDetails1方法的第182行,是读取Firestore用户数据时,没有对返回的DocumentSnapshot或者对应字段做非空校验就直接调用方法/取值导致的。
具体修改步骤
- 第一步:用户登录成功后,先从Firestore读取该用户的角色字段(可在用户表新增
role字段,值为buyer代表买家,seller代表卖家),把角色和UID一起存在SharedPreferences本地缓存:
// 登录成功后缓存用户信息示例 val sp = getSharedPreferences("AppPrefs", MODE_PRIVATE) sp.edit() .putString("user_role", userRole) // userRole从Firestore用户文档中读取 .putString("user_uid", currentUser.uid) .apply()
- 第二步:修改Splash页的跳转逻辑,直接读取本地缓存的角色判断跳转目标:
val sp = getSharedPreferences("AppPrefs", MODE_PRIVATE) val userRole = sp.getString("user_role", null) val userUid = sp.getString("user_uid", null) when { userUid.isNullOrEmpty() -> { // 无登录用户,跳转登录页 startActivity(Intent(this@Splash1Activity, Login1Activity::class.java)) } userRole == "buyer" -> { // 买家跳转买家面板 startActivity(Intent(this@Splash1Activity, Dashboard1Activity::class.java)) } userRole == "seller" -> { // 卖家跳转卖家面板 startActivity(Intent(this@Splash1Activity, DashboardActivity::class.java)) } else -> { // 角色异常,清空缓存跳转登录页 sp.edit().clear().apply() startActivity(Intent(this@Splash1Activity, Login1Activity::class.java)) } } finish()
- 第三步:修复
getUserDetails1方法的空指针问题,读取Firestore数据前先做非空校验:
// getUserDetails1 成功回调修改示例 override fun onSuccess(documentSnapshot: DocumentSnapshot?) { // 先判空再操作 val user = documentSnapshot?.toObject(User::class.java) ?: return // 后续业务逻辑 }
- 第四步:用户退出登录时,清空SharedPreferences的缓存内容,避免下次启动读取到旧的用户信息。
内容的提问来源于stack exchange,提问作者ayush jain
相关产品推荐
相关产品推荐

