【问题标题】:Firestore compound query not working for Flutter WebFirestore 复合查询不适用于 Flutter Web
【发布时间】:2020-11-22 12:23:51
【问题描述】:

您好,我在 StreamBuilder 中有一个对 Firestore 的简单查询

StreamBuilder(
          stream: FirestoreManager.firebaseFirestore
              .collection("orders")
              .orderBy('logs.0', descending: true)
              .where('status', whereIn: current['id'])
              .snapshots(),
          builder: (BuildContext context, AsyncSnapshot<dynamic> snap) {
            print(snap.data.toString());
            if (!snap.hasError && snap.hasData) {
              QuerySnapshot snapshot = snap.data;
              if (snapshot.documents.isNotEmpty) {
                List<DocumentSnapshot> snapList = snapshot.documents;
                return ListView.builder(
                  padding: EdgeInsets.only(right: 10, left: 10),
                  physics: ScrollPhysics(),
                  itemCount: snapList.length,
                  shrinkWrap: true,
                  itemBuilder: (BuildContext context, int index) {
                    return OrderListItem(
                      order: Order.fromJson(snapList[index].data),
                    );
                  },
                );
              } else {
                return Center(
                  child: Text(
                    "No ${current['status'].toString().trim()} Order Available...!",
                    style: TextStyle(fontSize: 20, fontWeight: FontWeight.bold),
                  ),
                );
              }
            } else {
              return Center(
                child: CircularProgressIndicator(),
              );
            }
          })

它对移动应用程序非常有效,但是当我尝试在网络上运行它时,它不起作用。 实际上它显示数据一秒钟然后再次消失。我通过使用print(snap.data.toString());打印快照数据得到了以下登录控制台@

js_primitives.dart:30 null
js_primitives.dart:30 Instance of 'QuerySnapshot'
js_primitives.dart:30 null

为什么会这样?为什么它显示的数据一次次消失呢? 如果我删除 .orderBy('logs.0', descending: true).where('status', whereIn: current['id']) ,那么它工作正常。

【问题讨论】:

  • 请编辑问题以包含更多详细信息,尤其是您如何记录这些结果。鉴于您在此处提供的内容,我们应该能够重现该问题。
  • 请检查一下,我只是使用print(snap.data.toString()); 进行日志记录。
  • 在 where 子句之后尝试 orderBy....也许你可以得到不同的 snapsnhots 顺序....

标签: flutter google-cloud-firestore flutter-web


【解决方案1】:

我在使用 Flutter Web 时遇到了同样的问题。我正在尝试使用两个链接的 where() 方法,但它没有给我任何结果:

StreamBuilder(
    stream: fire
        .collection('thiHistory')
        .where("device", "==", _device)
        .where("ts", '>=', ts)
        .onSnapshot,
    builder: (BuildContext context, AsyncSnapshot<QuerySnapshot> snapshot) {
      if (!snapshot.hasData) return Text('Loading....');

      final docs = snapshot.data.docs;

      return ListView.builder(
          scrollDirection: Axis.horizontal,
          itemCount: docs.length,
          itemBuilder: (context, index) {
            final doc = docs[index].data();
            return doc["device"] == _device ? Column(
              children: [
                Text(doc['device']),
                Text("${doc["hour"]}"),
                Text("${doc["temp"]}"),
                Text("${doc["humi"]}"),
                Text("${doc["thi"]}"),
              ],
            ) : Container();
          });
    },
  )

如果我只使用一个 where() 或另一个它工作正常。如果我同时使用两者,我总是得到“正在加载...”,这告诉我快照没有数据。

我还尝试将orderBy() 与Shahzad Akram 之类的where() 链接起来,同样的事情......使用其中一个效果很好,将它们组合起来不会返回数据。

我正在使用 firebase 7.3.0 包和库的 7.19.1 版本:

  <script src="https://www.gstatic.com/firebasejs/7.19.1/firebase-app.js"></script>
  <script src="https://www.gstatic.com/firebasejs/7.19.1/firebase-database.js"></script>
  <script src="https://www.gstatic.com/firebasejs/7.19.1/firebase-firestore.js"></script>

感谢您的帮助。

【讨论】:

  • 检查控制台日志。它应该指示您添加 Firestore 索引。
  • 我没有收到任何控制台日志消息来添加索引。
猜你喜欢
  • 2018-10-23
  • 1970-01-01
  • 1970-01-01
  • 2020-09-27
  • 2021-10-06
  • 2020-08-13
  • 2019-12-03
  • 2020-02-04
  • 2020-01-27
相关资源
最近更新 更多