如何从Firebase身份验证获取用户ID作为字符串?

时间:2019-06-20 14:45:19

标签: firebase flutter dart

我正在尝试将经过身份验证的用户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;
}

我做错了吗?

1 个答案:

答案 0 :(得分:2)

首先,您将Future.then语法和async await语法混合在一起。
您应该以这种方式编写方法:

void _fetchUID() async {
  var auth = AuthProvider.of(context).auth;
  _uid = (await auth.getCurrentUser()).uid;
}

如果以这种方式呼叫_uidnull仍然是您的_fetchUID,那么您根本就没有登录,这意味着您首次需要时没有FirebaseUser登录。

在您的_validateAndSubmit方法中,您还首先需要等待,您的_fetchUID调用,否则它将在分配值之前通过_uid

...
try {
  await _fetchUID();
  await Report.create(_uid, ..);
  ...