Пользователь возвращает значение null даже в операторе if

#android #firebase #firebase-authentication

#Android #firebase #firebase-аутентификация

Вопрос:

Я не могу понять, почему моя userId строка возвращается null . Пожалуйста, помогите.

 protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    //get firebase auth instance
    auth = FirebaseAuth.getInstance();
    mDatabaseReference = FirebaseDatabase.getInstance().getReference();
    Intent intent = getIntent();
    carName = intent.getStringExtra("carname");

    //get current user
    if (auth.getCurrentUser().getUid() != null) {
        userId = auth.getCurrentUser().getUid();
    }
    authStateListener = new FirebaseAuth.AuthStateListener() {
        @Override
        public void onAuthStateChanged(@NonNull FirebaseAuth firebaseAuth) {
            FirebaseUser user = firebaseAuth.getCurrentUser();
            if (user != null) {
                Log.d(TAG, "AUTH STATE SIGNED IN");
                userId = user.getUid();
                getCarName();
                mDatabaseReference.child("cars").setValue(userId);
            } else {
                //User is Signed out
                Log.d(TAG, "AUTH STATE SIGNED OUT");
                startActivity(new Intent(MainActivity.this, LoginActivity.class));
            }
        }
    };
    auth.addAuthStateListener(authStateListener);

    //set views
    setContentView(R.layout.activity_main);
    final TextView carNameTV = (TextView) findViewById(R.id.car_name);
    final TextView carAddressTV = (TextView) findViewById(R.id.car_notes);
    final TextView carCountTV = (TextView) findViewById(R.id.count);
    plusOneButton = (Button) findViewById(R.id.buttonIn);
    minusOneButton = (Button) findViewById(R.id.buttonOut);
    signOut = (Button) findViewById(R.id.sign_out_button);
    editCar = (Button) findViewById(R.id.edit_car_button);



    mDatabaseReference = FirebaseDatabase.getInstance().getReference().child("cars").child(userId);
  

Я смог обойти это, добавив это if утверждение перед слушателем. Я бы просто предпочел, чтобы это не выглядело так. Любая помощь приветствуется.

Комментарии:

1. Как вы определяете, что user.getUid() это значение равно нулю?

2. Потому что я получаю эту ошибку при попытке получить доступ к ссылке на базу данных java.lang. Исключение NullPointerException: не удается передать значение null для аргумента ‘pathString’ в child() —— это то, что я поставил рядом mDatabaseReference = FirebaseDatabase.getInstance().getReference().child(«бары»).child(идентификатор пользователя);

3. Опубликуйте код, который содержит FirebaseDatabase.getInstance().getReference().child("bars").‌​child(userId) , чтобы мы могли видеть контекст.

4. отредактировано — это то, что вы ищете?

Ответ №1:

Обратный вызов onAuthStateChanged() является асинхронным. Is не запускается с действительным идентификатором пользователя, пока пользователь не войдет в систему.

Оператор:

  mDatabaseReference = FirebaseDatabase.getInstance().getReference().child("cars").child(userId);
  

выполняется до userId того, как ему было присвоено значение в обратном вызове прослушивателя.

Комментарии:

1. как бы вы посоветовали мне это исправить?

2. Не могу ответить на этот вопрос, не зная вашего общего потока пользовательского интерфейса. Вы рассматривали проект Auth Quickstart в качестве примера пользовательского интерфейса auth?

3. Другой вариант — использовать Firebase-UI Auth .