Java FireBase getUid在返回值后返回为Null
我正在尝试使用用户ID创建子项。我在此处创建用户时找到了该ID,并在logcat中获得了该用户ID:Java FireBase getUid在返回值后返回为Null,java,android,firebase,firebase-authentication,Java,Android,Firebase,Firebase Authentication,我正在尝试使用用户ID创建子项。我在此处创建用户时找到了该ID,并在logcat中获得了该用户ID: final String fullName = findViewByid(R.id.fullName); . . // Other strings declared here . public void onComplete(@NonNull Task<AuthResult> task) {
final String fullName = findViewByid(R.id.fullName);
.
. // Other strings declared here
.
public void onComplete(@NonNull Task<AuthResult> task) {
if (task.isSuccessful()) {
FirebaseUser newUserID = mAuth.getCurrentUser();
userID = newUserID.getUid();
Log.w(TAG, "AuthenticationComplete:true //id:" + userID);
final String fullName=findviewbyd(R.id.fullName);
.
. // 此处声明的其他字符串
.
未完成的公共void(@NonNull任务){
if(task.issusccessful()){
FirebaseUser newUserID=mAuth.getCurrentUser();
userID=newUserID.getUid();
Log.w(标记“AuthenticationComplete:true//id:+userID”);
检查logcat,查看userID变量。检查auth控制台,获得“身份验证完成:true//id:userID”
这就是问题所在
public void onComplete(@NonNull Task<AuthResult> task) {
.
.
.
});
Log.w(TAG, "AuthenticationComplete:true //id:" + userID);
BasicUser newUser = new BasicUser(fullName, uname, userEmail, password, confirmPassword, city, newState, zip, type);
Log.w(TAG, "idcheck:" + userID);
**reference.child(userID).setValue(newUser);**
public void onComplete(@NonNull任务){
.
.
.
});
Log.w(标记“AuthenticationComplete:true//id:+userID”);
BasicUser newUser=newbasicuser(全名、uname、userEmail、密码、confirmPassword、city、newState、zip、type);
Log.w(标记“idcheck:+userID”);
**reference.child(userID).setValue(newUser)**
我再次检查了日志,得到“身份验证完成:true//id:userid”
“idcheck:null”
我尝试过的事情:
- 将子项更改为uname(另一个字符串变量)。数据按预期发布到实时数据库中
- 将“”放在用户ID周围。我不确定它会做什么,但值得一试
- 在onComplete方法中放置所有字符串和底部代码
public class(){
String fullName;
public void signUp(){
public void onComplete(@NonNull Task<AuthResult> task) {
});
Log.w(TAG, "AuthenticationComplete:true //id:" + userID);
BasicUser newUser = new BasicUser(fullName, uname, userEmail, password, confirmPassword, city, newState, zip, type);
Log.w(TAG, "idcheck:" + userID);
reference.child(userID).setValue(newUser);
public类(){
字符串全名;
公开无效注册(){
未完成的公共void(@NonNull任务){
});
Log.w(标记“AuthenticationComplete:true//id:+userID”);
BasicUser newUser=newbasicuser(全名、uname、userEmail、密码、confirmPassword、city、newState、zip、type);
Log.w(标记“idcheck:+userID”);
reference.child(userID).setValue(newUser);
看起来您试图在onComplete
回调之外访问userID
,但该回调不起作用
这是因为身份验证是异步进行的,在运行reference.child(userID).setValue(newUser)
时,userID=newUserID.getUid()
尚未运行。如果您在调试器中运行代码,并在这些行上放置断点,或者在这些行中添加一些日志记录,则最容易看到这一点
任何需要UID的代码都需要在用户登录完成时调用的onComplete
中,或者从那里调用
因此:
public void onComplete(@NonNull Task,用于实时数据库,但处理相同的问题,包含较长的解释和示例
因此,我将变量设置为全局变量。有点小问题。编辑内容在更新后的帖子中。请编辑问题,以完整显示不工作的代码,而不是将其拆分。我尝试过,但我没有将变量设置为全局变量。我这样做时,它工作正常。谢谢!
public void onComplete(@NonNull Task<AuthResult> task) {
if (task.isSuccessful()) {
FirebaseUser newUserID = mAuth.getCurrentUser();
userID = newUserID.getUid();
BasicUser newUser = new BasicUser(fullName, uname, userEmail, password, confirmPassword, city, newState, zip, type);
reference.child(userID).setValue(newUser);
...
});