我正在尝试将经过身份验证的用户ID作为文档ID插入数据到Firestore,但是我从参数中得到了null。

请看一下我的脚本。

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;
}

我做错了吗?

最佳答案

首先,您混合了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, ..);
  ...

关于firebase - 如何从Firebase身份验证获取用户ID作为字符串?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/56688534/

10-09 04:21