У меня есть приложение для Android, использующее FireBase. Когда пользователь регистрируется у меня есть триггер на firebase, который создает документ в коллекции с данными по умолчанию для пользователя.
Это код функции, используемой в качестве триггера на базе огня:
exports.sendWelcomeEmail = functions.auth.user().onCreate((user) =>
{
var userCoinsCol = db.collection('user_data');
userCoinsCol.doc(user.uid).set({
coins : 100, // some another information for user you could save it here.
active: true,
completedRewards: 0
})
.then(() => {
console.log("done");
return;
})
.catch((err) =>
{
console.log("Error creating data for just created user. => "+err);
return;
});
});
Все это прекрасно работает. Проблема в том, что после регистрации мне нужны пользовательские данные, и иногда, когда пользователь регистрируется, кажется, что приложение не готово к использованию в следующем упражнении.
Итак, мой вопрос, есть ли способ для приложения Android ждать, пока триггер не создаст этот документ, прежде чем перейти к следующему действию, которое будет использовать эти пользовательские данные?
Как вы можете догадаться, это происходит только в первый раз, когда пользователь регистрируется. Позже, если пользователь хочет снова использовать приложение, все работает нормально, потому что пользовательские данные были созданы сразу после регистрации пользователя.
Редактировать: После небольшой игры я пришел с этим решением, но оно кажется не слишком эффективным, потому что оно может получать много документов. Я просто добавляю это для справки:
public void CreateAccount()
{
if(!TextUtils.isEmpty(emailreg.getText()) && !TextUtils.isEmpty(passreg.getText()))
{
mAuth.createUserWithEmailAndPassword(emailreg.getText().toString(), passreg.getText().toString())
.addOnCompleteListener(this, new OnCompleteListener<AuthResult>()
{
@Override
public void onComplete(@NonNull Task<AuthResult> task)
{
progressBar.setVisibility(View.INVISIBLE);
if (task.isSuccessful())
{
// Sign in success, update UI with the signed-in user's information
final FirebaseUser user = mAuth.getCurrentUser();
// ----> Start waiting for the user_data document to be created and go to the next activity
FirebaseFirestore db = FirebaseFirestore.getInstance();
final EventListener<QuerySnapshot> listener = new EventListener<QuerySnapshot>() {
@Override
public void onEvent(@javax.annotation.Nullable QuerySnapshot queryDocumentSnapshots, @javax.annotation.Nullable FirebaseFirestoreException e) {
List<DocumentSnapshot> documents = queryDocumentSnapshots.getDocuments();
boolean found = false;
for(DocumentSnapshot ds : documents)
{
if(ds.getId().equals(user.getUid()))
{
Intent intent = new Intent(LoginActivity.this, MainActivity.class); // Call the AppIntro java class
startActivity(intent);
}
}
}
};
db.collection("user_data").addSnapshotListener(listener);
} else
{
// If sign in fails, display a message to the user.
Toast.makeText(LoginActivity.this, getString(R.string.tryagain), Toast.LENGTH_SHORT).show();
}
// ...
}
});
}else
{
Toast.makeText(LoginActivity.this, getString(R.string.tryagain), Toast.LENGTH_SHORT).show();
progressBar.setVisibility(View.INVISIBLE);
}
}