首页 > 解决方案 > 遍历不同长度的firebase集合

问题描述

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

在此处输入图像描述

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

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

标签: flutterlistviewdartgoogle-cloud-firestore

解决方案


您当前仅显示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();
      },
    );

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


推荐阅读