【问题标题】:Iterating through firebase collection of varying lengths遍历不同长度的firebase集合
【发布时间】:2021-04-23 17:35:14
【问题描述】:

我正在尝试在 列表视图 中显示名为“user_orders”的子集合中的数据,每个文档(以绿色突出显示)都包含用户在名为“列表”的列表中购买的项目大车'。 目的是在列表中显示此购物车数据,但问题是购物车的长度会根据用户订购的内容而变化/变化,这会在尝试迭代多个时导致问题(范围错误) user_orders 文档

我一直在尝试使用 StreamBuilder,但在这种情况下 [index] 只返回第一个值。我真的是 Flutter 的新手,非常感谢您的帮助。

StreamBuilder(
    stream: FirebaseFirestore.instance
            .collection('orders')
            .doc(user.user.uid)
            .collection('user_orders')
            .snapshots(),
    builder: (context, orderSnapshot) {
        return orderSnapshot.hasData
            ? ListView.builder(
                  itemCount: orderSnapshot.data.documents.length,
                  itemBuilder: (BuildContext context, int index) {
                      DocumentSnapshot orderData = orderSnapshot.data.documents[index];
                      return ListTile(
                          title: Text(orderData.get('cart')[index]['title']),
                      );
                  },
              ) : LoadingPage();
           },
       )

【问题讨论】:

    标签: flutter listview dart google-cloud-firestore


    【解决方案1】:

    您当前仅显示每个文档的 cart 的值之一。你应该这样做:

     StreamBuilder<QuerySnapshot>(
          stream: FirebaseFirestore.instance
              .collection('orders')
              .doc("uid")
              .collection('user_orders')
              .snapshots(),
          builder: (context, orderSnapshot) {
            if (orderSnapshot.hasData) {
              final carts = orderSnapshot.data.docs.map((e) => e.get("cart"));
              final cartValues =
                  carts.entries.expand((element) => element).toList();
    
              return ListView.builder(
                itemCount: cartValues.length,
                itemBuilder: (BuildContext context, int index) {
                  final title = cartValues[index]["title"];
                  return ListTile(
                    title: Text(title),
                  );
                },
              );
            }
            return LoadingPage();
          },
        );
    

    请注意我没有尝试运行这段代码,它可能包含错误,但我相信它足以指导你。

    【讨论】:

    • 这个解决方案进行了微调,我必须在元素 Final soln>> final cartValues = carts.entries.expand((element) => element).toList() 之后删除 (.value)
    • @TMoreMaker 很高兴它对您有用,更新了答案以反映您的改进以供将来参考。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-05-02
    • 2016-07-23
    • 2016-02-23
    • 2015-02-21
    • 1970-01-01
    • 1970-01-01
    • 2021-03-05
    相关资源
    最近更新 更多