如何在 flutter firebase 中获取今天记录的 doc.length

How to get the doc.length of today record in flutter firebase

我是 flutter firebase 的新手,如何显示我的 Total sales 销售记录的长度。我有 SalesRecord 和字段名称 Created 的集合,我想知道这一天我做了多少销售。

我的代码:

var todaySales = 0;
FutureBuilder(
    future: FirebaseFirestore.instance
        .collection('SalesRecord')
        // .orderBy('Created', descending: true | false)
        .where("Created", isGreaterThan: DateTime.now())
        .get()
        .then((myDocuments) {
      setState(() {
        todaySales = myDocuments.docs.length;
      });
      //print("${myDocuments.docs.length}");
    }),
    builder: (context, snapshot) {
      if (snapshot.hasData) {
        return const Center(
            child: CircularProgressIndicator());
      } else if (snapshot.hasError) {
        return const Center(
            child: CircularProgressIndicator());
      }
      return Text(
        todaySales.toString(),
        style: const TextStyle(
          fontSize: 50.0,
          fontWeight: FontWeight.bold,
        ),
      );
    }),

代码更新:-

FutureBuilder<QuerySnapshot<Map<String, dynamic>>>(
                        future: FirebaseFirestore.instance
                            .collection('SalesRecord')
                            .where("Created",
                                isGreaterThan: DateTime.now())
                            .get(),
                        builder: (context, snapshot) {
                          if (snapshot.hasData) {
                            return Text(
                              snapshot.data!.docs.length.toString(),
                              style: const TextStyle(
                                fontSize: 50.0,
                                fontWeight: FontWeight.bold,
                              ),
                            );
                          } else if (snapshot.hasError) {
                            return const Center(
                                child: CircularProgressIndicator());
                          } else {
                            return CircularProgressIndicator();
                          }
                        }),

当我更新 SalesRecord 时,它更改了一段时间的值,但记录计数在 20 秒后再次自行恢复为 0

您可以执行以下操作:

          FutureBuilder<QuerySnapshot<Map<String, dynamic>>>(
              future: FirebaseFirestore.instance
                  .collection('SalesRecord')
                  .where("Created", isGreaterThan: DateTime.now())
                  .get(),
              builder: (context, snapshot) {
                if (snapshot.hasData) {
                  return Text(
                    snapshot.data!.docs.length.toString(),
                    style: const TextStyle(
                      fontSize: 50.0,
                      fontWeight: FontWeight.bold,
                    ),
                  );
                } else if (snapshot.hasError) {
                  return const Center(child: CircularProgressIndicator());
                } else {
                  return CircularProgressIndicator();
                }
              }),

get() returns a Future<QuerySnapshot<Map<String, dynamic>>> 因此将其分配给 future 属性。然后 AsyncSnapshot 类型的 snapshot 将包含此 future 的数据,您可以使用 data 属性 在 if(snapshot.hasData) 中访问它。

计数返回 0 的原因是 DateTime.now() 获取当前日期时间,即如果您在 30 秒前进行了销售,则不会显示,因为当前时间比现在晚 30 秒比上一个。

因此声明一个如下所示的变量,它将为我们提供今天的日期 (2022-01-31 00:00:00.000) 和零时间值以标记一天的开始。

DateTime dateToday = DateTime(DateTime.now().year, DateTime.now().month, DateTime.now().day);

现在在您的代码中将其用作:-

FutureBuilder<QuerySnapshot<Map<String, dynamic>>>(
      future: FirebaseFirestore.instance
          .collection('SalesRecord')
          .where("Created",
          isGreaterThan: dateToday)
          .get(),
      builder: (context, snapshot) {
        if (snapshot.hasData) {
          return Text(
            snapshot.data!.docs.length.toString(),
            style: const TextStyle(
              fontSize: 50.0,
              fontWeight: FontWeight.bold,
            ),
          );
        } else if (snapshot.hasError) {
          return const Center(
              child: CircularProgressIndicator());
        } else {
          return CircularProgressIndicator();
        }
      })