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

Android实现管理员/用户双身份自动登录及代码崩溃修复咨询

问题修复方案

核心问题根因

  1. 跳转逻辑错误:你写的getCurrentUserID()和getCurrentUserID1()两个方法逻辑完全一致,只要用户通过FirebaseAuth登录,两个方法都会返回相同的非空UID,判断条件永远命中第一个分支,所有登录用户都会跳转到买家面板,完全无法区分角色。
  2. 崩溃问题:空指针异常出现在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 08:36:03