一旦变量通过androidstudio中的if-else子句,我如何访问它的新值



我创建了一个代码,默认情况下,引用在驱动程序节点中,如果快照不存在,则更改为客户,但问题是它没有更改。当我查看代码时,我意识到变量没有被使用,所以我想知道是否有任何方法可以这样做。这是我的代码

auth=FirebaseAuth.getInstance();
uid = auth.getCurrentUser().getUid();
button=findViewById(R.id.button2);
Fixmail = findViewById(R.id.fixedemail);
password=findViewById(R.id.editTextTextPassword);
reference = FirebaseDatabase.getInstance().getReference("Users");
DatabaseReference uidRef = reference.child("Driver").child(uid); //this variable
ValueEventListener valueEventListener = new ValueEventListener() {
@Override
public void onDataChange(@NonNull DataSnapshot snapshot) {//TODO find how to change uidRef
if (snapshot.exists()) {
Users usersnapshot = snapshot.getValue(Users.class);
if (usersnapshot != null) {
String Email = usersnapshot.getMail();
Fixmail.setText(Email);
}
} else {
final DatabaseReference uidRef=reference.child("Customer").child(uid);
Users usersnapshot = snapshot.getValue(Users.class);
if (usersnapshot != null) {
String Email = usersnapshot.getMail();
Fixmail.setText(Email);
}
}
}
@Override
public void onCancelled(@NonNull DatabaseError error) {
}
};
uidRef.addListenerForSingleValueEvent(valueEventListener);

您不能在所处的上下文中重新分配该变量;局部变量必须是final有效的final,才能在匿名类中使用。

即使可以,uidRef.addListenerForSingleValueEvent也会在捕获新值之前被调用。新值不会注册侦听器,因为您永远不会将侦听器重新添加到新值中。


首先,您应该删除在else块中创建的本地uidRef,以避免阴影问题。

在else块中,您将从原始uidRef(当前为Driver,这将从驱动程序中删除侦听程序(中删除侦听器。你可以通过

uidRef.removeValueListener(this)

然后,您将获得您想要的子级(Customer(,并将侦听器添加到新的子级中。

你可以通过

reference.child("Customer").child(uid).addListenerForSingleValue(this)

最新更新