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

Firebase双身份登录后根据Realtime Database的isDoctor字段跳转页面问题

实现步骤

1. 定义登录结果数据类

首先新增一个数据类承载登录成功后需要返回的额外信息:

data class LoginSuccessResult(
    val isDoctor: Boolean,
    val tipRes: Int
)

2. 修改RemoteDataSource的login方法

登录认证通过后,从Realtime Database拉取当前用户的isDoctor标识,和成功提示一起返回:

fun login(email: String, password: String): Flow<State<Any>> = flow<State<Any>> {
    emit(State.loading(true))
    val auth = Firebase.auth
    val dbRef = FirebaseDatabase.getInstance().reference // 初始化实时数据库引用

    val data = auth.signInWithEmailAndPassword(email, password).await()
    data?.let {
        val currentUser = auth.currentUser ?: return@let
        if (currentUser.isEmailVerified) {
            // 从实时数据库拉取当前用户的isDoctor字段
            val userSnapshot = dbRef.child("users").child(currentUser.uid).get().await()
            val isDoctor = userSnapshot.child("isDoctor").getValue(Boolean::class.java) ?: false
            // 返回包含身份标识的成功结果
            emit(State.succes(LoginSuccessResult(isDoctor = isDoctor, tipRes = R.string.login_succes)))
        } else {
            currentUser.sendEmailVerification()?.await()
            emit(State.failed(R.string.verify_email_first.toString()))
        }
    }
}.catch {
    emit(State.failed(it.message ?: "登录失败"))
}.flowOn(Dispatchers.IO)

注意:上述代码中child("users")需要替换为你实际存储用户信息的数据库根节点名。

3. 修改登录页State.Success分支逻辑

拿到身份标识后跳转对应页面:

is State.Succes -> {
    loadingDialog.stopLoading()
    val result = loginResult.data as LoginSuccessResult
    Snackbar.make(
        mBinding.root,
        getString(result.tipRes),
        Snackbar.LENGTH_SHORT
    ).show()
    // 根据身份跳转对应页面
    val targetActivity = if (result.isDoctor) {
        DoctorActivity::class.java
    } else {
        PatientActivity::class.java
    }
    startActivity(Intent(this@LoginActivity, targetActivity))
    finish() // 可选:关闭登录页防止用户按返回键退回
}

补充说明

  • 如果你的State类已经是泛型实现,可以直接把State<Any>改成State<LoginSuccessResult>避免类型强转
  • 可以根据业务需求补充isDoctor字段为空的兜底逻辑,比如跳转至身份选择页
  • 记得添加实时数据库的读取权限,避免权限不足导致查询失败

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 11:36:08