flutter - 如何从 Firestore 获取当前的 UserId?
问题描述
我有一个集合users
,每个用户都有自己的文档。现在我想创建一个子集合来存储与特定用户相关的更多数据。
这是到目前为止的代码:
class DatabaseService {
Future isUserRegistered(String uid) async{
return await FirebaseFirestore.instance.collection('users')
.where('uid', isEqualTo: uid)
.get();
}
Future registerNewUser(email, password, uid) async{
return await FirebaseFirestore.instance.collection('users')
.doc(uid).set(
{
"email": email,
"password": password,
"uid": uid,
"token": -1,
"userGoal": false,
"userGender": false,
},
);
}
我创建了一个保存函数,但不是将数据存储在具有当前 uid 的文档内的子集合中,而是创建了一个名为“uid”的新文档。如何解决?
Future saveInSubcollectionToRemote() async{
Map<String, dynamic> data = UserManager.userWeights;
return await FirebaseFirestore.instance.collection('users')
.doc('uid')
.collection('weights')
.doc(data['userWeight'])
.set(data);
}
class UserManager {
static Map<String, dynamic> userWeights = {'weights': []};
}
编辑这是我的谷歌身份验证,在这里我得到一个 id 但我想要的是 uid 而不是这个 id
///Authentication
void signInGoogle(context) {
DatabaseService handler = new DatabaseService();
_googleSignIn
.signIn()
.then((userdata) => {
print(userdata.toString()),
handler
.isUserRegistered(userdata.id.toString())
.then((value) => {
if (value.docs.length == 0)
{
print("Not registered"),
registerUserToApp(
context, userdata.email.toString(), "password", userdata.id.toString())
}
else
{
print(value.docs[0].data().toString()),
UserManager.userdata = value.docs[0].data(),
Navigator.pushAndRemoveUntil(
context,
MaterialPageRoute(
builder: (context) {
return NavBar();
},
),
(route) => false,
),
}
})
.catchError((e) => {
showAlertDialog(
context, "Error", ""),
})
})
.catchError(
(e) => {showAlertDialog(context, "Error", "")});
}
void registerUserToApp(context, email, password, uid) {
DatabaseService handler = new DatabaseService();
try {
handler.registerNewUser(email, password, uid).then((value) => {
showAlertDialog(context, "Congratulations!",
"You registered to the app"),
});
} catch (error) {
print(error.toString());
showAlertDialog(context, "Error", "");
}
}
}
解决方案
您的uid
代码中的 通常是用户的唯一标识。Firestore 本身不知道这样的uid
. 相反,它uid
来自您使用的身份提供者。
您可以使用 Google 登录中的用户 ID 来识别 Firestore 中的用户,但更常见的是使用 Firebase 登录(也)。
登录 Google 后,您可以使用这些凭据通过调用社交身份验证signInWithCredential
文档中所示的方式登录 Firebase 身份验证。
登录 Firebase 身份验证后,您会从 Firebase 身份验证中获得一个 UID,然后您可以使用它来识别 Firestore 中的用户文档(以及以后对这些文档的安全访问)。
完成此操作后,您可以通过FirebaseAuth.instance.currentUser
(一次)或FirebaseAuth.instance.currentUser()
(连续)获取当前用户(以及他们的 UID),然后在 Firestore 调用中再次使用该用户。
推荐阅读
- java - Apache Camel 中的整数拆分列表
- javascript - React Native Typescript 中的“导出默认值”导致解析语法错误
- css - 具有`位置:绝对的项目;顶部:0;left: 0;` 在 Chrome for Android 上与它的父级有差距
- android - Windows 10 中的 Cordova 设置面临模拟器错误
- spring-boot - 使用 swagger 的 pdf 格式的 api 文档
- python - 用于预测输出数据的前馈 ANN(工程动力学)
- kubernetes - Kubenetes 访问 api 网络
- kubernetes - 无法使用 nginx 入口控制器访问在集群内 pod 上运行的应用程序
- c# - Mongo to MySQL - 正确的关系设计
- javascript - 问题得到非结构化对象 - Angular