我正在尝试将经过身份验证的用户ID作为文档ID插入数据到Firestore,但是我从参数中得到了空值。
请看一下我的脚本。
void didChangeDependencies() {
uid = '';
super.didChangeDependencies();
}
Future _fetchUID() async {
var auth = AuthProvider.of(context).auth;
return await auth.getCurrentUser().then((user) => _uid = user.uid);
}
_validateAndSubmit() async {
setState(() {
_errorMessage = '';
_isLoading = true;
});
if (_validateAndSave()) {
try {
_fetchUID();
await Report.create(_uid, _suspectName, _plateNumber, _civilizationId,
_drivingLicenseId, _clause, _description);
return Navigator.of(context).pop();
} catch (e) {
setState(() {
_isLoading = false;
_errorMessage = e.message;
});
print(_errorMessage);
throw Exception(e);
}
}
}
在下面的此方法中,您可以看到我已经尝试设置_uid
,但是仍然无法获取_uid
值。
Future _fetchUID() async {
var auth = AuthProvider.of(context).auth;
return await auth.getCurrentUser().then((user) => _uid = user.uid);
}
这就是getCurrentUser()
方法的样子。
Future<FirebaseUser> getCurrentUser() async {
FirebaseUser user = await _firebaseAuth.currentUser();
return user;
}
我做错了吗?
答案 0 :(得分:2)
首先,您将Future.then
语法和async
await
语法混合在一起。
您应该以这种方式编写方法:
void _fetchUID() async {
var auth = AuthProvider.of(context).auth;
_uid = (await auth.getCurrentUser()).uid;
}
如果以这种方式呼叫_uid
后null
仍然是您的_fetchUID
,那么您根本就没有登录,这意味着您首次需要时没有FirebaseUser
登录。
在您的_validateAndSubmit
方法中,您还首先需要等待,您的_fetchUID
调用,否则它将在分配值之前通过_uid
。
...
try {
await _fetchUID();
await Report.create(_uid, ..);
...