【问题标题】:Filtering data from Firebase Firestore过滤来自 Firebase Firestore 的数据
【发布时间】:2020-06-11 17:20:23
【问题描述】:

我在名为“category”的文档中有一个字段,在“category”中我有 6 种不同类型的值(1-6)。我想在不同的屏幕上显示每个值的文档。因此,例如,所有值为 2 的“类别”字段都应显示在屏幕 2 上。我该如何让它工作?

Widget build(BuildContext context) {
    return FutureBuilder(
        future: FirebaseAuth.instance.currentUser(),
        builder: (ctx, futureSnapshot) {
          if (futureSnapshot.connectionState == ConnectionState.waiting) {
            return const Center(
              child: const CircularProgressIndicator(),
            );
          }
          return StreamBuilder(
              stream: Firestore.instance
              .collection('facts')
              .orderBy('category')
              .where('category', isEqualTo: '1')
              .where('category', isEqualTo: '2')
              .where('category', isEqualTo: '3')
              .where('category', isEqualTo: '4')
              .where('category', isEqualTo: '5')
              .where('category', isEqualTo: '6')
              .snapshots(),

              builder: (ctx, snapshot) {
                if (snapshot.connectionState == ConnectionState.waiting) {
                  return Center(
                    child: CircularProgressIndicator(
                      valueColor: AlwaysStoppedAnimation<Color>(
                        Theme.of(context).colorScheme.deepOrange,
                      ),
                    ),
                  );
                }

                final factsDocs = snapshot.data.documents;
                return Container(
                  decoration: BoxDecoration(
                    image: DecorationImage(
                      image: AssetImage("assets/facts_bg.jpg"),
                      fit: BoxFit.cover,
                    ),
                  ),
                  child: Scaffold(
                    backgroundColor: Colors.transparent,
                    body: ListView.builder(
                      padding: const EdgeInsets.symmetric(
                          horizontal: 10, vertical: 10),
                      itemCount: factsDocs.length,
                      itemBuilder: (ctx, index) =>
                          _factsList(context, factsDocs[index]),
                    ),
                  ),
                );
              });
        });
  }

  Widget _factsList(BuildContext context, DocumentSnapshot document) {
    return Container(
      child: Card(
        margin: const EdgeInsets.only(bottom: 16),
        elevation: 6,
        shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(12)),
        color: Colors.white.withOpacity(0.9),
        child: Column(
          children: [
            Column(
              children: [
                Container(
                  width: MediaQuery.of(context).size.width,
                  height: 120,
                  child: Column(
                    children: [
                      Padding(
                        padding: const EdgeInsets.only(top: 8),
                        child: ListTile(
                          title: Container(
                            child: Text(
                              document['title'] == null
                                  ? ''
                                  : document['title'],
                              style: whiteH1Txt,
                            ),
                          ),
                          subtitle: Padding(
                            padding: const EdgeInsets.only(top: 8),
                            child: Text(
                              document['category'] == null
                                  ? ''
                                  : document['category'],
                              style: whiteSubTxt,
                            ),
                          ),

【问题讨论】:

    标签: firebase flutter google-cloud-firestore


    【解决方案1】:

    您执行此查询的方式:

    stream: Firestore.instance
        .collection('facts')
        .orderBy('category')
        .where('category', isEqualTo: '1')
        .where('category', isEqualTo: '2')
        .where('category', isEqualTo: '3')
        .where('category', isEqualTo: '4')
        .where('category', isEqualTo: '5')
        .where('category', isEqualTo: '6')
    

    保证返回 0 个文档。 Firestore 查询将逻辑 AND 应用于每个 where 子句。这个查询正在做的是询问类别为 1 AND 2 AND 3 等的文档,您可以看到这是不可能的。

    如果您想要一个包含每个类别的逻辑 OR,则可以使用 whereIn 查询:

    stream: Firestore.instance
        .collection('facts')
        .orderBy('category')
        .where('category', whereIn: ['1', '2', '3', '4', '5', '6'])
    

    您的代码将不得不查看每个文档以查看它来自哪个类别并决定如何处理它。

    【讨论】:

    • 如何在新屏幕上显示某个类别的值?
    • 您尝试过的某些事情没有按您预期的方式工作吗?这听起来与正确查询完全不同。
    猜你喜欢
    • 1970-01-01
    • 2018-10-26
    • 1970-01-01
    • 2020-11-08
    • 2021-11-24
    • 1970-01-01
    • 2021-05-23
    • 2021-08-02
    • 1970-01-01
    相关资源
    最近更新 更多