android - 只有在 Firebase 中成功创建用户后,才能将文档添加到 Firestore?
问题描述
本质上,我正在尝试使用 Firebase 身份验证创建一个新用户,但我也想将用户的信息作为文档添加到 Firestore,但只有在成功创建新用户的情况下,否则不应到达创建文档的代码。
firebaseAuth.createUserWithEmailAndPassword(email, password)
.addOnCompleteListener(this, new OnCompleteListener<AuthResult>() {
@Override
public void onComplete(@NonNull Task<AuthResult> task) {
if(task.isSuccessful()) {
Toast.makeText(SignUpActivity.this, "Registered successfully", Toast.LENGTH_LONG).show();
} else {
Toast.makeText(SignUpActivity.this, "Could not register. Please try again.", Toast.LENGTH_LONG).show();
if (Build.VERSION.SDK_INT >= 11) {
SignUpActivity.this.recreate();
} else {
SignUpActivity.this.finish();
SignUpActivity.this.startActivity(SignUpActivity.this.getIntent());
}
}
}
});
Map<String, Object> user = new HashMap<>();
user.put("email", email);
user.put("fName", fName);
user.put("lName", lName);
if(studentRadioButton.isChecked()) {
user.put("studentNum", email.substring(1, 9));
}
firebaseFirestore.collection("users").document(firebaseAuth.getUid()).set(user);
我尝试过的一种方法(如下所示)是重新创建当前活动,但它只是回到它开始的地方并最终移动到它创建文档的代码上。对于我尝试过的所有其他方法,就好像除了 Toast 弹出窗口之外,我无法将任何内容放入 onCompleteListener 中的 onComplete 方法中。请帮忙!
解决方案
正如 aryan 评论的那样:为确保仅在 Firebase 身份验证中创建用户时创建文档,请将代码移动到if
:
firebaseAuth.createUserWithEmailAndPassword(email, password)
.addOnCompleteListener(this, new OnCompleteListener<AuthResult>() {
@Override
public void onComplete(@NonNull Task<AuthResult> task) {
if(task.isSuccessful()) {
Toast.makeText(SignUpActivity.this, "Registered successfully", Toast.LENGTH_LONG).show();
Map<String, Object> user = new HashMap<>();
user.put("email", email);
user.put("fName", fName);
user.put("lName", lName);
if(studentRadioButton.isChecked()) {
user.put("studentNum", email.substring(1, 9));
}
firebaseFirestore.collection("users").document(firebaseAuth.getUid()).set(user);
} else {
Toast.makeText(SignUpActivity.this, "Could not register. Please try again.", Toast.LENGTH_LONG).show();
if (Build.VERSION.SDK_INT >= 11) {
SignUpActivity.this.recreate();
} else {
SignUpActivity.this.finish();
SignUpActivity.this.startActivity(SignUpActivity.this.getIntent());
}
}
}
});
推荐阅读
- javascript - 将节点js的缓冲区转换为图像并显示在网站上
- c++ - 为什么在 C++ 中调用此构造函数时会出现未定义的引用错误?
- json - 在 sqlite 中,如何将逗号分隔的键值对拆分为列?
- c# - DryWetMIDI 通过释放键盘键接收 NoteOn
- c++ - 在类中产生线程
- list - 将列表列表变成一个列表函数式编程(球拍,方案)
- java - 在 Javalin 框架中加密数据库密码的可能方法
- flutter - 触发并等待不同 BLoC 中的项目创建
- jquery - 在前三个和后四个 Jquery 或 Javascript 之后用破折号格式化数字
- ios - Swift Alamofire list view state