0

我的应用使用 FirebaseAuth。在我的 SignInActivity 中,单击登录按钮后,将signInWithEmailAndPassword onCompleteListener使用 Intent 启动我的 DashboardActivity。在 DashboardActivity 中,FirebaseAuth.getInstance().getCurrentUser().getUid()如果尝试登录的用户不存在,该方法会调用该方法会使我的应用程序崩溃。 这里的问题是:如果没有发送 Intent,为什么要调用该方法?还是发送了意图?

这是我的 SignInActivity 登录按钮代码:

signIn.setOnClickListener((new View.OnClickListener() {
    @Override
    public void onClick(View view) {
        if (!email.getText().toString().equals("") && !password.getText().toString().equals("")) {
            showProgressBar();
            FirebaseAuth.getInstance().signInWithEmailAndPassword(email.getText().toString(), password.getText().toString()).addOnCompleteListener((new OnCompleteListener<AuthResult>() {
                @Override
                public void onComplete(@NonNull Task<AuthResult> task) {
                    hideProgressBar();
                    Toast.makeText(SignInActivity.this, "Signed In", Toast.LENGTH_SHORT).show();
                    Intent intent = new Intent(SignInActivity.this, DashboardActivity.class);
                    startActivity(intent);
                    finish();
                }
            })).addOnFailureListener((new OnFailureListener() {
                @Override
                public void onFailure(@NonNull Exception e) {
                    hideProgressBar();
                    Toast.makeText(SignInActivity.this, "Failed to Sign In", Toast.LENGTH_SHORT).show();
                }
            }));
        } else {
            Toast.makeText(SignInActivity.this, "please fill all fields", Toast.LENGTH_SHORT).show();
        }
    }
}));

DashboardActivity 代码(使应用程序崩溃):

private void queryDB() {
    DatabaseReference reference = FirebaseDatabase.getInstance().getReference();
    Query query = reference.child(getString(R.string.users))
            .child(FirebaseAuth.getInstance().getCurrentUser().getUid())
            .child("securityLevel");
    query.addValueEventListener(new ValueEventListener() {
        @Override
        public void onDataChange(DataSnapshot dataSnapshot) {
            String secLevel = dataSnapshot.getValue(String.class);
            if (secLevel.equals("1")) {
                fab.hide();
            } else {
                fab.show();
            }
            Log.d(TAG, "onDataChange: +-+ " + secLevel);
        }
        @Override
        public void onCancelled(DatabaseError databaseError) {
        }
    });
}

日志猫:

Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.String com.google.firebase.auth.FirebaseUser.getUid()' on a null object reference
        at com.quwaysim.regapp.DashboardActivity.queryDB(DashboardActivity.java:191)
        at com.quwaysim.regapp.DashboardActivity.onCreate(DashboardActivity.java:60)
        at android.app.Activity.performCreate(Activity.java:7136)
        at android.app.Activity.performCreate(Activity.java:7127).......
4

2 回答 2

2

无论授权是否通过,OnComplete 都会执行。您需要添加 OnSuccessListener 并在那里处理意图。

于 2019-12-12T17:27:12.970 回答
1

您没有检查任务是否成功。你必须这样做:

@Override
public void onClick(View view) {
    if (!email.getText().toString().equals("") && !password.getText().toString().equals("")) {
        showProgressBar();
        FirebaseAuth.getInstance().signInWithEmailAndPassword(email.getText().toString(), password.getText().toString()).addOnCompleteListener((new OnCompleteListener<AuthResult>() {
            @Override
            public void onComplete(@NonNull Task<AuthResult> task) {
                if(task.isSuccessful() && task.getResult() != null){
                    hideProgressBar();
                    Toast.makeText(SignInActivity.this, "Signed In", Toast.LENGTH_SHORT).show();
                    Intent intent = new Intent(SignInActivity.this, DashboardActivity.class);
                    startActivity(intent);
                    finish();
                }
            }
        })).addOnFailureListener((new OnFailureListener() {
            @Override
            public void onFailure(@NonNull Exception e) {
                hideProgressBar();
                Toast.makeText(SignInActivity.this, "Failed to Sign In", Toast.LENGTH_SHORT).show();
            }
        }));
    } else {
        Toast.makeText(SignInActivity.this, "please fill all fields", Toast.LENGTH_SHORT).show();
    }
}
}));
于 2019-12-12T17:23:41.680 回答