【问题标题】:creating listview with getting data from firestore on flutter在颤振上从firestore获取数据创建listview
【发布时间】:2020-07-20 09:43:03
【问题描述】:

我有一个应用程序,我需要将这些数据从 firestore 数据库中一一获取到 Flutter 上的 Listview。我尝试了很多东西,比如流构建器和未来构建器,但我无法获得,因为我的数据库使用嵌套数据如果您有任何建议,请告诉我非常感谢。有什么解决方案可以读取所有这些嵌套数据吗?有时项目名称可能不同,因此如果嵌套数据具有 id 或数量值,我可以读取

这个我已经用过了,但是没用:

  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();
  }
 }

【问题讨论】:

  • 现在您是否从快照流中返回任何内容
  • 没有这个页面
  • 您是否收到任何日志错误?如果是,请在此处添加。当您未提供来自 firebase 的许可时,也会发生这种情况。
  • 我没有收到任何错误,但我在我的应用程序中看不到任何内容它没有显示任何内容如果没有像这样嵌套,我可以写入和读取数据

标签: flutter google-cloud-firestore


【解决方案1】:

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

【讨论】:

  • 那么我应该为我的应用使用哪个数据库你有什么建议
  • 嗨 @MehmetReşatDemir 我相信 Firestore 对你来说是一个不错的选择,但你需要改变你的数据模型,所以它不像现在那样“免费”。
【解决方案2】:

除了我上面的答案之外,我还更改了您的代码,您还错误地查询了您的嵌套数据库,因为我需要一个索引来完成这项工作,所以我不得不移动一些东西。您可能需要使用它才能使其正常工作,但总体思路就在那里。



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);
  }
}

【讨论】:

  • 很抱歉,我对其进行了一些小改动,但您仍然一无所获
  • 您可能需要考虑在此处将地图更改为数组@Frank Van Puffelen 建议链接stackoverflow.com/questions/54012380/…
【解决方案3】:

这里的问题是你访问的特定实例是地图,所以你可能想要这样做:

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

【讨论】:

  • 但正如我上面所说,项目名称可能会更改,所以我只想将所有数据都放到列表视图中
  • 也许你可以尝试将地图包装在firebase中的数组中,这样你就可以获得该数组的长度,你可以轻松地绘制列表视图
  • 我没明白你到底是什么意思抱歉
  • 我的意思是改变你的数据库结构
  • 或尝试使用我最好猜测的模型
猜你喜欢
  • 2021-12-22
  • 2021-03-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-10-01
  • 2021-03-26
相关资源
最近更新 更多