使用flutter从Firestore获取数据来创建ListView

时间:2020-04-08 03:31:08

标签: flutter google-cloud-firestore

我有一个应用程序,我需要将这些数据从firestore数据库中逐一地移到Listview中。我尝试了很多类似流生成器和将来的生成器的方法,但是由于我的数据库可以处理嵌套数据,因此无法获取,如果您有任何建议,请非常感谢。有什么解决方案可以读取所有这些嵌套数据?有时商品名称可能会有所不同,所以如果嵌套数据具有id或数量值

我可以读取

enter image description here

我已经用过了,但是不起作用:

  import 'package:flutter/material.dart';
  import 'package:cloud_firestore/cloud_firestore.dart';

  class cart_page extends StatelessWidget {
@override
Widget build(BuildContext context) {
return new StreamBuilder<QuerySnapshot>(
    stream: Firestore.instance.collection("cart").where("quantity", 
   isGreaterThanOrEqualTo: 1).snapshots(),
     builder: (BuildContext context, AsyncSnapshot<QuerySnapshot> 
     snapshot) {
      if (!snapshot.hasData) return new Text("There is no expense");
      return new ListView(children: getExpenseItems(snapshot));
    });
     }

     getExpenseItems(AsyncSnapshot<QuerySnapshot> snapshot) {
      return snapshot.data.documents
         .map((doc) => new ListTile(
        title: new Text(doc["itemName"]),
        subtitle: new Text(doc["quantity"]))
  )
    .toList();
  }
 }

3 个答案:

答案 0 :(得分:1)

问题是您正在访问的特定实例是map,因此您可能需要这样做:

title: new Text(doc["Item 9"]["itemName"]),
subtitle: new Text(doc["Item 9"]["quantity"]))

答案 1 :(得分:1)

除了我上面的答案以外,我还更改了代码,您还查询了嵌套数据库错误,并且由于我需要索引才能完成这项工作,因此我不得不四处移动。您可能需要尝试使用它才能使它起作用,但是总的思路就在那里。



class Example extends StatelessWidget {
   var listOfWidgets = [];
  @override
  Widget build(BuildContext context) {
    return ListView.builder(
      itemCount: //number of items ,
      itemBuilder: (BuildContext context, int index) => StreamBuilder(

          stream: Firestore.instance
              .collection("cart")
              .where("Item$index.quantity", isGreaterThanOrEqualTo: 1)
              .snapshots(),
          builder:
              (BuildContext context, AsyncSnapshot<QuerySnapshot> snapshot) {
                  if (!snapshot.hasData) return new Text("There is no expense");
                   return ...listOfWidgets;
              }),
    );
  }

  getExpenseItems(AsyncSnapshot<QuerySnapshot> snapshot) {

    var item = snapshot.data.documents
        .map((doc) => new ListTile(
            title: new Text(doc["Item$index.Name"]),
            subtitle: new Text(doc["Item$index.quantity"])))
        .toList();
    listOfWidgets.add(item);
  }
}

答案 2 :(得分:0)

Firestore不支持您需要的查询类型,即您需要读取整个“父亲”集合,因此您可以阅读文档和子集合。 Firestore上的Queris很浅,因此它们不允许这么多的功能。正如社区其他人所告知和评论的那样,更改数据库更好,因此它遵循一种模式,而不是每次都有可能使用不同名称的项目。