Я пытаюсь проверить наличие ошибок на моем экране входа в систему, который подключен к Firebase, OnCompleteListener, который я использую, проверяет, если:
1) Пользователь уже зарегистрировался или нет
2) Если пользователь предоставил мне информацию в моей базе данных
Всякий раз, когда пользователь вводит электронное письмо, которое не аутентифицировано, оно также говорит ему предоставить информацию (проверка наличия уникального идентификатора для нуля), но этого не должно происходить, или, другими словами, почему if (task.isComplete() && !task.isSuccessful())
Запускать при отсутствии уникального идентификатора и пользователя
Вот код OnCompleteListener, игнорируйте OnSuccesslistener
Task<AuthResult> authResultTask = firebaseAuth.signInWithEmailAndPassword(Email, Password)
// if login is complete
.addOnCompleteListener(new OnCompleteListener<AuthResult>() {
@Override
public void onComplete(@NonNull Task<AuthResult> task) {
// dismisses progressbar and checks if the users has already given Essential Information,
// If not it will take him to the essential information activity
progressDialog.dismiss();
if (task.isComplete() && !task.isSuccessful()){
// Checks if user has submitted information in the Essential Information activity
// Takes the Unique ID(if it is present if not it will tell him to sign up or invalid email)
// asks the firebase database if he has given information to the database
FirebaseUser user = firebaseAuth.getCurrentUser();
String UserUID = user.getUid();
reference.child("Users").child(UserUID).addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
// User exists
if (dataSnapshot.exists()) {
//Displays Toast telling user that their information is saved in the database
Toast.makeText(LogInActivity.this, "You have data in our database ", Toast.LENGTH_SHORT).show();
}
//User doesn't have information in the database
else {
// Displays Toast telling user he/she needs to sign in into the firebase database
// User goes to UserInformationActivity to give his/her information
Toast.makeText(LogInActivity.this, "You need to give Essential Information", Toast.LENGTH_SHORT).show();
// 3 second delay
final Handler handler = new Handler();
handler.postDelayed(new Runnable() {
@Override
public void run() {
// Goes to UserInformationActivity
Intent GoToUserInformation = new Intent(LogInActivity.this, UserInformationActivity.class);
LogInActivity.this.startActivity(GoToUserInformation);
}
}, 3000);
}
}
// if the checking got cancelled, likability of that happening is small
@Override
public void onCancelled(DatabaseError databaseError) {
}
});
}
if (!task.isSuccessful()) {
try {
throw task.getException();
} catch(FirebaseAuthInvalidUserException e) {
Toast.makeText(LogInActivity.this, "Invalid email, You need to sign up first", Toast.LENGTH_SHORT).show();
// 3 second delay
final Handler handler = new Handler();
handler.postDelayed(new Runnable() {
@Override
public void run() {
// Goes to UserInformationActivity
Intent Signup = new Intent(LogInActivity.this, SignupActivity.class);
LogInActivity.this.startActivity(Signup);
}
}, 3000);
} catch(Exception e) {
Toast.makeText(LogInActivity.this, "", Toast.LENGTH_SHORT).show();
Log.e("Exception", e.getMessage());
}
}
}
})
.addOnSuccessListener(new OnSuccessListener<AuthResult>() {
@Override
public void onSuccess(AuthResult authResult) {
Toast.makeText(LogInActivity.this, "SuccesListener working", Toast.LENGTH_SHORT).show();
}
});
Ваш task.iscomplete() является избыточным в вашем первом операторе if. Посмотрите на метод, которым вы пользуетесь, public void onComplete(...). Вам нужен только task.isSuccessful()
@ AndréKool Многие источники, в основном, я написал его сам, он использует снимки данных для проверки дочернего элемента, называемого «пользователи» в базе данных, и если данных нет, он перейдет к действию, чтобы дать информацию, есть комментарии, но если вы Любые вопросы, не стесняйтесь спрашивать :)
@Michael Да, но если я поставлю task.isSuccessful(), OnSuccessListener будет работать, я не хочу, чтобы пользователь видел, что «Successlistener работает, если вход в систему не на 100% правильный, это означает, что он предоставил информацию в базу данных и уже зарегистрировался.
Может быть, у вас в настоящее время есть зарегистрированный пользователь, данные которого все еще находятся в системе? Вы всегда должны проверять текущего пользователя в соответствии с документами.
@Ashish Пользователь должен автоматически выходить из системы, когда я перезапускаю приложение, потому что я не сохраняю текущего пользователя из активности регистрации и не отправляю его в журнал, он не должен сохранять вошедшего в систему пользователя
Что происходит, когда вы удаляете! из первого оператора if?
В чем причина использования! Task.isSuccessful () дважды? Думаю, у вас должен быть task.isSuccessful () в первом операторе. Спасибо Андре.
@ AndréKool Такая же проблема сохраняется, когда я удалил task.isComplete() и удалил! из task.isSuccessful() Я обнаружил, что он работает немного более правильно, но я хочу, чтобы он запускался ТОЛЬКО, если пользователь зарегистрирован, НО он не предоставил никакой информации в базу данных, в настоящее время, когда я подписываюсь с электронной почтой, которая не t аутентифицирован с помощью firebase, он говорит мне зарегистрироваться (это то, что я хочу), и он также говорит мне, что мне нужно предоставить информацию (не должно происходить)
Небольшое обновление: удаление! из task.isSuccessful(), похоже, запускает оператор if, даже если я предоставил информацию в базу данных (этого не должно происходить), но он работает, когда у кого-то есть учетная запись, и она еще не предоставила информацию в базу данных




Это выглядит действительно странно по сравнению с официальные документы. Где ты взял этот код?