【问题标题】:Flutter firebase stream with dynamic document id/path具有动态文档 ID/路径的 Flutter Firebase 流
【发布时间】:2021-12-29 14:16:01
【问题描述】:

我有一个颤振应用程序,我在 main.dart 中使用 StreamProvider,如下所示:

          ...
          StreamProvider(
          catchError: (context, error) {
            print(error);
          },
          initialData: null,
          create: (context) => _quizService.getCurrentQuestionStream()),
          ...

在应用程序中,我有一个名为 QuizQuestion 的集合,每个文档都有一个日期作为它的 id,例如 2021-12-15,因此应用程序每天都应该获取当天的 QuizQuestion。我的流函数如下所示:

  Stream<QuizQuestion> getCurrentQuestionStream() {
    String currentDate = DateFormat('yyyy-MM-dd').format(DateTime.now());
    try {
      return _firebaseFirestore
          .collection("QuizQuestion")
          .doc(currentDate)
          .snapshots()
          .map((doc) => QuizQuestion.fromJson(doc.data()));
    } catch (e) {
      return e.message;
    }
  }

这可以获取当天的 QuizQuestion,但是如果用户从一天到下一天打开应用程序,流函数仍然“订阅”以获取上一个日期,因为它不会定义 @987654324再次@变量。我正在尝试弄清楚如何解决这个问题,是否有一些方法可以在 Flutter 中监听一天的变化以使用新日期重新初始化流,还是我需要在这里重新考虑后端?

【问题讨论】:

    标签: firebase flutter dart google-cloud-firestore


    【解决方案1】:

    无法更改现有查询。您必须为新日期构建一个新查询。

    有两种常用的方法:

    • 在您的应用程序代码中跟踪当前日期,并在您检测到新日期后构建新查询。
    • 将当前日期写入数据库中的固定位置/文档,例如qotd 用于当天的问题/测验。例如,当您还编写第二天的测验时,您可以这样做。现在让您的应用程序监听该文档,当您检测到文档中的更改时,加载当天的测验。

    两者都是有效选项,您可以将任一选项嵌入到您自己的流中,然后将其提供给流构建器。我通常更喜欢后者,因为它还为我提供了一种方法来控制可以通过安全规则读取哪些测验。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-01-12
      • 2014-12-28
      • 1970-01-01
      • 2021-11-19
      • 1970-01-01
      • 2020-11-02
      • 2021-12-11
      • 1970-01-01
      相关资源
      最近更新 更多