#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 .