获取具有等于flutter中特定字符串的字段的Firestore文档

Posted

技术标签:

【中文标题】获取具有等于flutter中特定字符串的字段的Firestore文档【英文标题】:Get Firestore documents with a field that is equal to a particular string in flutter 【发布时间】:2021-11-27 11:13:32 【问题描述】:

我正在尝试获取集合中具有等于特定字符串的特定字段的文档。我正在构建一个 POS,我想获得特定城市的所有销售额。

final FirebaseFirestore _firestore = FirebaseFirestore.instance;
final CollectionReference _mainCollection = _firestore.collection('Sales');


  Stream<QuerySnapshot> readFeeds() 
    CollectionReference notesItemCollection =
    _mainCollection.where('seller_location', isEqualTo: "London").get();

    return notesItemCollection.snapshots();
  

我收到此错误:

“Future>”类型的值不能分配给“CollectionReference”类型的变量。

我已经添加了演员as CollectionReference&lt;Object?&gt;;,但查询仍然无法正常工作。这就是我访问数据的方式:

  @override
  Widget build(BuildContext context) 
    return StreamBuilder<QuerySnapshot>(
      stream: readFeeds(),
      builder: (context, snapshot) 
        if (snapshot.hasError) 
          return Text('Something went wrong');
         else if (snapshot.hasData || snapshot.data != null) 
          return ListView.separated(
            separatorBuilder: (context, index) => SizedBox(height: 16.0),
            itemCount: snapshot.data!.docs.length,
            itemBuilder: (context, index) 
              var noteInfo = snapshot.data!.docs[index];
              String docID = snapshot.data!.docs[index].id;
              String name = noteInfo['name'].toString();
              String price = noteInfo['price'].toString();
              String quantity = noteInfo['quantity'].toString();
              return Ink(
                decoration: BoxDecoration(
                  color: CustomColors.firebaseGrey.withOpacity(0.1),
                  borderRadius: BorderRadius.circular(8.0),
                ),
                child: ListTile(
                  shape: RoundedRectangleBorder(
                    borderRadius: BorderRadius.circular(8.0),
                  ),
                  onTap: () => Navigator.of(context).push(
                    MaterialPageRoute(
                      builder: (context) => EditScreen(
                        documentId: docID,
                        currentName: name,
                        currentPrice: price,
                        currentQuantity: quantity,
                      ),
                    ),
                  ),
                  title: Text(
                    name,
                    maxLines: 1,
                    overflow: TextOverflow.ellipsis,
                    style: TextStyle(color: Colors.white),
                  ),
                ),
              );
            ,
          );
        
        return Center(
          child: CircularProgressIndicator(
            valueColor: AlwaysStoppedAnimation<Color>(
              CustomColors.firebaseOrange,
            ),
          ),
        );
      ,
    );
  

【问题讨论】:

【参考方案1】:

您收到以下错误:

“Future>”类型的值不能分配给“CollectionReference”类型的变量。

因为下面这行代码:

CollectionReference notesItemCollection =
    _mainCollection.where('seller_location', isEqualTo: "London").get();

这是有道理的,因为get() 函数返回一个Future 而不是一个CollectionReference 对象。 Dart 中没有办法创建这样的转换,因此会出现错误。

由于您使用的是where() 函数,因此返回的对象类型为Query。所以你的代码应该是这样的:

Query queryBySellerLocation =
    _mainCollection.where('seller_location', isEqualTo: "London");

正确定义此查询后,您可以执行 get() 调用并收集结果:

queryBySellerLocation.get().then(...);

【讨论】:

【参考方案2】:

如果有帮助,请尝试一下。

QuerySnapshot<Map<String,dynamic>>readFeeds() 
   QuerySnapshot<Map<String,dynamic>>response=await   _mainCollection.where('seller_location', isEqualTo: "London").get()

return response;
  

你可以像这样访问这些数据

response.docs.forEach((element) 
        ///this is Map<String,dynamic>
        element.data();
      );

【讨论】:

以上是关于获取具有等于flutter中特定字符串的字段的Firestore文档的主要内容,如果未能解决你的问题,请参考以下文章

Flutter & Firebase - 从文档中获取特定字段

Flutter Firebase - 从文档中获取特定字段

Flutter Firestore - 获取存储为字符串的 URL 时出现空安全错误

Flutter Firebase - 搜索包含字符串的文档

在访问查询中仅显示具有特定字段数据的最后一条记录

Flutter:使用 Streambuilder<QuerySnapshot> 时如何在 firestore 中获取特定文档