Android 使用onDataChange验证值的解决方案(Firebase数据库和Firebase验证)
我试图使用用户的角色验证身份验证,因此我设置了一个布尔值来检查用户的角色是“培训师”还是“受训者”。但是,Android 使用onDataChange验证值的解决方案(Firebase数据库和Firebase验证),android,firebase,android-studio,kotlin,Android,Firebase,Android Studio,Kotlin,我试图使用用户的角色验证身份验证,因此我设置了一个布尔值来检查用户的角色是“培训师”还是“受训者”。但是,onDataChange仅在意图之后更改布尔值 private lateinit var auth: FirebaseAuth private lateinit var firebaseDatabase: FirebaseDatabase private lateinit var databaseReference: DatabaseReference var trainer:Boolean
onDataChange
仅在意图之后更改布尔值
private lateinit var auth: FirebaseAuth
private lateinit var firebaseDatabase: FirebaseDatabase
private lateinit var databaseReference: DatabaseReference
var trainer:Boolean = false
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_login)
auth = FirebaseAuth.getInstance()
firebaseDatabase = FirebaseDatabase.getInstance()
databaseReference = firebaseDatabase.getReference("users")
backRegister.setOnClickListener {
val intent = Intent(this, MainActivity::class.java)
startActivity(intent)
}
btnSignIn.setOnClickListener {
val email = etEmail.text.toString()
val pass = etPass.text.toString()
login(email, pass)
}
}
fun login(email:String, pass:String){
auth.signInWithEmailAndPassword(email, pass)
.addOnCompleteListener(this) { task ->
if (task.isSuccessful) {
val user = auth.currentUser
if (user != null) {
checkRole(user)
if(trainer){
intent = Intent(this, HomeTrainer::class.java)
Toast.makeText(baseContext, "Welcome Trainer",
Toast.LENGTH_SHORT).show()
startActivity(intent)
}
else {
var intent = Intent(this, Home::class.java)
Toast.makeText(baseContext, "Welcome Trainee",
Toast.LENGTH_SHORT).show()
startActivity(intent)
}
}
} else {
Toast.makeText(baseContext, "Login Failed",
Toast.LENGTH_SHORT).show()
}
}
}
fun checkRole(user:FirebaseUser){
val postListener = object : ValueEventListener {
override fun onDataChange(dataSnapshot: DataSnapshot) {
for (datas in dataSnapshot.children) {
if (datas.key.toString() == user.uid) {
trainer = false
if (datas.child("role").getValue().toString().trim().equals("trainer")) {
trainer = true
}
}
}
}
override fun onCancelled(databaseError: DatabaseError) {
}
}
databaseReference.addValueEventListener(postListener)
}
Firebase API是
异步的
,这意味着调用onDataChange()
函数后立即返回,它返回的任务的回调将在稍后调用。无法保证需要多长时间。因此,在数据可用之前,可能需要几百毫秒到几秒钟的时间。由于该方法立即返回,因此您尝试使用的trainer
变量的值尚未从回调中填充。因此,简单地将其创建为一个全局变量是没有帮助的,它的值总是false
基本上,您正在尝试同步使用来自异步API的值。那不是个好主意。您应该按照预期异步处理API
这个问题的一个快速解决方法是在回调中只使用
bool
变量的值,否则我建议您查看我的anwser的最后一部分,我已经在其中解释了如何使用自定义回调来完成它。Hi pyro!你试过我上面的方法吗?如果你认为我的答案对你有帮助,请考虑通过点击复选来接受它。✔️) 在投票箭头的左边。应该换成绿色。我会很感激的。谢谢!