【问题标题】:Why is my document not saved in the firestore database?为什么我的文档没有保存在 firestore 数据库中?
【发布时间】:2021-11-23 10:30:03
【问题描述】:

您好,我编写了以下类来将用户数据保存到 Firestore:

class UserDataService {
  static Future<String?> createUserRecord(
      String userID, String name, String email) async {
    try {
      await userCollection.doc(userID).set({
        userDataName: name,
        userDataEmail: email,
      });
      return createdRecordMessage;
    } catch (e) {
      debugPrint(e.toString());
      return e.toString();
    }
  }
}

如果我单击我的注册按钮,则会执行以下代码,该代码将调用上述方法:

 register(String? nameOfUser, String? emailOfUser, String? passwordOfUser,
      PropertyManagement? pm, BuildContext context) async {
    String? errorMessage = await widget.authService
        .registerWithEmailAndPassword(
            nameOfUser!.trim(), emailOfUser!.trim(), passwordOfUser!);

    if (errorMessage == signedInMessage) {
      errorMessage = await UserDataService.createUserRecord(
          widget.authService.currentUser()!.uid, nameOfUser, emailOfUser);

      if (errorMessage == createdRecordMessage) {
        errorMessage = await PropertyManagementDataService.createDatabaseRecord(
            pm!, widget.authService.currentUser()!);

        if (errorMessage == createdRecordMessage) {
          widget.authService.signOut();
          NavigationService.navigateToHome(context);
          return;
        }
      }
    }

    SnackbarService.displayWithTitleAndMessage(context, 'Error:', errorMessage);
  }

有人能说出为什么这不起作用吗?

我在 firebase 上的安全规则不是问题。 而且我之前也注册过用户。所以应用的 auth 状态是经过身份验证的。

奇怪的是,如果我第一次启动我的应用并点击按钮,什么都没有发生。

当我再次单击该按钮时,数据将显示在数据库中。

所以我提供了一段视频,展示了应用在运行时的情况。 https://streamable.com/0rlkj5

  1. 在那里我尝试创建用户。哪个有效,但未保存 Firestore 数据。
  2. 之后,我删除了 firebase 中的用户,同时保持我的应用程序打开,然后再次单击注册按钮,然后它就可以工作了。

为什么第一次不行?

提前致谢。

【问题讨论】:

  • 同样在调用方法时,用户数据、姓名、邮箱不为空。
  • 我认为您正在尝试更新现有文档。我在您的代码中注意到的一件事是 - 您使用 .set() 替换了现有的文档数据。您可以使用 .update() 函数来更新文档中的某些字段,而不是使用它
  • 另外,请尝试添加一些关于单击按钮后实际发生的情况的解释。
  • 感谢您的回答。 set() 可以,因为我尝试注册该用户,因此数据库中没有要更新的文档。我还编辑了我的问题以显示该方法的调用位置和方式
  • 在我调用方法创建用户记录的那一行之后发生的所有事情都不会被执行。但是我的程序仍在运行,并且没有抛出错误。我可以正常使用该应用程序。 Firestore 里什么都没有。

标签: firebase flutter google-cloud-firestore user-data


【解决方案1】:

好的,我修好了!经过三天的工作,我意识到 firebase 团队将 Web 包从 8.4.1 版本更新到了 8.6.1

这个项目相当新,所以我使用了 8.6.1,所以我现在降级到 8.4.1,现在它工作得很好。所以我的代码没有问题,但版本 8.6.1 有问题。

我换了这个:

  <script src="https://www.gstatic.com/firebasejs/8.6.1/firebase-app.js"></script>
  <script src="https://www.gstatic.com/firebasejs/8.6.1/firebase-analytics.js"></script>
  <script src="https://www.gstatic.com/firebasejs/8.6.1/firebase-auth.js"></script>
  <script src="https://www.gstatic.com/firebasejs/8.6.1/firebase-firestore.js">

到这里:

  <script src="https://www.gstatic.com/firebasejs/8.4.1/firebase-app.js"></script>
  <script src="https://www.gstatic.com/firebasejs/8.4.1/firebase-analytics.js"></script>
  <script src="https://www.gstatic.com/firebasejs/8.4.1/firebase-auth.js"></script>
  <script src="https://www.gstatic.com/firebasejs/8.4.1/firebase-firestore.js"></script>

所以现在我使用了一个过时的版本,但它可以工作。希望他们能解决这个问题。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-02-20
    • 1970-01-01
    • 2020-05-26
    • 1970-01-01
    • 2016-10-21
    • 1970-01-01
    • 2020-04-28
    • 1970-01-01
    相关资源
    最近更新 更多