Firebase Auth возвращает неправильное значение - PullRequest
0 голосов
/ 13 мая 2018
import android.support.annotation.NonNull;
import android.util.Log;

import com.google.android.gms.tasks.OnCompleteListener;
import com.google.android.gms.tasks.Task;
import com.google.firebase.auth.AuthResult;
import com.google.firebase.auth.FirebaseAuth;
import com.google.firebase.auth.FirebaseAuthInvalidCredentialsException;
import com.google.firebase.auth.FirebaseAuthInvalidUserException;
import com.google.firebase.auth.FirebaseAuthUserCollisionException;
import com.google.firebase.auth.FirebaseUser;
import com.sachintitus.instafy.instafy.repository.Model.Status;


public class FirebaseAuthentication implements Authentication {

    public static String TAG = "FIREBASEAUTHENTICATION";

    public Status userAuthStatus;
    private FirebaseAuth mAuth;

    public FirebaseAuthentication() {
        mAuth = FirebaseAuth.getInstance();
        userAuthStatus = Status.SIGNED_OUT;
    }

    @Override
    public Status signIn(String email, String password) {
        Log.w("AUTH", "Started");
        mAuth.signInWithEmailAndPassword(email, password)
            .addOnCompleteListener(new OnCompleteListener<AuthResult>() {
                @Override
                public void onComplete(@NonNull Task<AuthResult> task) {
                    if (task.isSuccessful()) {
                        // Sign in success, update UI with the signed-in user's information
                        FirebaseUser user = mAuth.getCurrentUser();

                        userAuthStatus = Status.SIGNIN_SUCCESS;
                        Log.w(TAG, "signInWithEmail:success");
                        Log.w(TAG, String.valueOf(userAuthStatus));

                    } else {
                        // If sign in fails, display a message to the user.
                        Log.w(TAG, "signInWithEmail:failure", task.getException());

                        if (task.getException() instanceof FirebaseAuthInvalidUserException) {
                            Log.w(TAG, "signInWithEmail: failure", task.getException());
                            userAuthStatus = Status.SIGNIN_FAILED_NEW_USER;
                        }
                        if (task.getException() instanceof FirebaseAuthInvalidCredentialsException) {
                            Log.w(TAG, "SignInWithEmail: Faulure", task.getException());
                            userAuthStatus = Status.SIGNIN_FAILED_WRONG_PASSWORD;
                        }

                    }

                    // ...
                }
            });
        Log.w(TAG, "returns" + userAuthStatus);
        return userAuthStatus;
    }

    @Override
    public void signUp(String email, String password) {

        mAuth.createUserWithEmailAndPassword(email, password)
            .addOnCompleteListener(new OnCompleteListener<AuthResult>() {
                @Override
                public void onComplete(@NonNull Task<AuthResult> task) {
                    if (task.isSuccessful()) {
                        // Sign in success, update UI with the signed-in user's information
                        Log.d(TAG, "createUserWithEmail:success");
                        FirebaseUser user = mAuth.getCurrentUser();
                        userAuthStatus = Status.SIGNUP_SUCCESS;

                    } else {
                        // If sign up fails, display a message to the user.
                        Log.w(TAG, "createUserWithEmail:failure", task.getException());

                        if (task.getException() instanceof FirebaseAuthUserCollisionException) {
                            Log.w(TAG, "User already exists, sign up failed", task.getException());
                            userAuthStatus = Status.SIGNUP_FAILED_EXISTING_USER;

                        }
                    }
                }
            });

    }
}

Этот фрагмент кода возвращает значения Enum, когда пользователь вошел в систему. Когда приложение запущено, статус должен быть SIGNED_OUT, и он должен измениться на SIGNIN_SUCCESS, поскольку вход в FirebaseAuth выполнен успешно.Однако он всегда возвращает SIGNED_OUT.

Подробнее:

  • Значение изменений локального объекта статуса внутри функций onComplete и onFail
  • Это значение возвращается после завершения аутентификации

Заранее спасибо

1 Ответ

0 голосов
/ 14 мая 2018

Вы не можете вернуть то, что еще не было загружено. Другими словами, вы не можете просто использовать объект userAuthStatus вне метода onComplete(), поскольку он всегда будет иметь значение по умолчанию Status.SIGNED_OUT из-за асинхронного поведения этого метода. Это означает, что к тому времени, когда вы пытаетесь использовать этот результат вне этого метода Log.w(TAG, "returns" + userAuthStatus);, данные еще не закончили загрузку из базы данных, и поэтому они недоступны. Быстрое решение этой проблемы - использовать этот результат только внутри метода onComplete(), или, если вы хотите использовать его вне этого метода, я рекомендую вам посмотреть последнюю часть моего ответа из этого поста , в котором я объяснил, как это можно сделать с помощью пользовательского обратного вызова. Вы также можете взглянуть на это видео для лучшего понимания.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...