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
相关产品推荐
相关产品推荐

