firebase - 检查用户是否存在于 FIrestore
问题描述
我有这个使用 SignInWithGogle 登录/注册用户的功能
void _signInWithGoogle() async {
final GoogleSignInAccount googleUser = await _googleSignIn.signIn();
final GoogleSignInAuthentication googleAuth =
await googleUser.authentication;
final AuthCredential credential = GoogleAuthProvider.getCredential(
accessToken: googleAuth.accessToken,
idToken: googleAuth.idToken,
);
final FirebaseUser user = (await _auth.signInWithCredential(credential)).user;
assert(user.email != null);
assert(user.displayName != null);
assert(!user.isAnonymous);
assert(await user.getIdToken() != null);
final FirebaseUser currentUser = await _auth.currentUser();
assert(user.uid == currentUser.uid);
print('user email here $user.email');
setState(() {
if (user != null) {
_success = true;
_userID = user.uid;
final userToSubmit = User(
email: user.email,
id: user.uid,
name: user.displayName,
owner: false,
favorites: null);
print('USER ID USER ID USER ID ${user.uid}');
DocumentReference dbRef =
Firestore.instance.collection('users').document(user.uid);
dbRef.get().then((value) {
print('VALUE EXISTS? ${value.exists} y VALUE $value');
value.exists ?
_goToHomeScreen(user)
:
dbRef
.collection('prf')
.document('profile')
.setData(userToSubmit.toJson())
.then(_goToHomeScreen(user));
});
} else {
_success = false;
}
});
}
问题是,当用户注销然后登录时,它会设置新数据并且用户丢失了他们拥有的所有东西,比如收藏夹等等......我认为检查文档是否存在应该可以解决问题,但是尽管文档在那里存在返回假。这是我正在谈论的一段代码
DocumentReference dbRef =
Firestore.instance.collection('users').document(user.uid);
dbRef.get().then((value) {
print('VALUE EXISTS? ${value.exists} y VALUE $value');
value.exists ?
_goToHomeScreen(user)
:
dbRef
.collection('prf')
.document('profile')
.setData(userToSubmit.toJson())
.then(_goToHomeScreen(user));
});
}
为什么即使 user.uid 和文档存在它也会返回 false?我究竟做错了什么?
解决方案
我实现的最终解决方案是这样的:
FirebaseUser firebaseUser;
try {
firebaseUser = (await FirebaseAuth.instance.signInWithCredential(credential)).user;
} catch(e) {
print(e.toString());
} finally {
final userToSubmit = User(
email: firebaseUser.email,
id: firebaseUser.uid,
name: firebaseUser.displayName,
owner: false,
restauranteAdded: false);
DocumentReference dbRef =
Firestore.instance.collection('users').document(firebaseUser.uid).collection('nameOfTheCollection').document('documentName');
dbRef.get().then((data) {
data.exists ? _goToHomeScreen(user) :
_createUser();
});
这样,我检查用户文档是否存在于我的 Firestore 数据库中,如果不存在,则创建它。
推荐阅读
- python - 将 np.tril 和 np.triu 堆叠在一起
- c++ - 可变参数模板折叠程序在 gcc9 中失败
- php - 我怎样才能使ajax安全?
- brightway - 与明威不同单位交流
- listview - Xamarin:具有回收元素和动态行高的 Listview
- c# - 如何通过 AutoMapper 实现具有通用 Queue 类型属性的对象映射
- sql - 使用 sql 查询读取 CSV 数据
- regex - 使用 sed 作为通用替换器
- swift - 在 Swift 中进行应用内购买时,从不同的视图控制器中隐藏 UIButton
- postgresql - 网络故障后恢复 pg_restore