尝试通过流访问子集合时出现 RangeError (RangeError (index): Invalid value: Valid value range isempty: 0)

发布于 2025-01-16 20:28:30 字数 4951 浏览 2 评论 0原文

我试图在 flutter 中创建 2 个下拉菜单,并通过 firebase 流填充。这个想法是,用户可以选择一个类别,然后第二个下拉列表将根据所选类别显示相关的子类别。发生的事情是我不断收到以下信息。我的子类别集合嵌套在我的类别集合

RangeError (RangeError(索引):无效值:有效值范围为空:0)中

 static Stream<QuerySnapshot> getCategories() {
    return catsRef.orderBy('name', descending: false).snapshots();
  }

  static Stream<QuerySnapshot> getSubCategories(category) {
    return catsRef
        .doc(category)
        .collection('sub-categories')
        .orderBy('name', descending: false)
        .snapshots();
  }



StreamBuilder<QuerySnapshot>(
                      stream: DatabaseService.getCategories(),
                      builder: (BuildContext context,
                          AsyncSnapshot<QuerySnapshot> snapshot) {
                        if (!snapshot.hasData) return Container();
                        if (setDefaultCategory) {
                          category = snapshot.data.docs[0].get('name');
                          debugPrint('setDefault category: $category');
                        }
                        return DropdownButton(
                          isExpanded: false,
                          value: category,
                          items: snapshot.data.docs.map((value) {
                            return DropdownMenuItem(
                              value: value.get('name'),
                              child: Text('${value.get('name')}'),
                            );
                          }).toList(),
                          onChanged: (value) {
                            debugPrint('selected onchange: $value');
                            setState(
                              () {
                                debugPrint('category selected: $value');
                                category = value;
                                setDefaultCategory = false;
                                setDefaultMakeModel = true;
                              },
                            );
                          },
                        );
                      },
                    ),
                    Container(
                      child: category != null
                          ? StreamBuilder<QuerySnapshot>(
                              stream:
                                  DatabaseService.getSubCategories(category),
                              builder: (BuildContext context,
                                  AsyncSnapshot<QuerySnapshot> snapshot) {
                                if (!snapshot.hasData) {
                                  debugPrint(
                                      'snapshot status: ${snapshot.error}');
                                  return Container(
                                    child: Text(
                                        'snapshot empty category: $category sub-category: $subCategory'),
                                  );
                                }
                                if (setDefaultMakeModel) {
                                  subCategory =
                                      snapshot.data.docs[0].get('name');
                                  debugPrint('setDefault subCat: $subCategory');
                                }
                                return DropdownButton(
                                  isExpanded: false,
                                  value: subCategory,
                                  items: snapshot.data.docs.map((value) {
                                    debugPrint('subCat: ${value.get('name')}');
                                    return DropdownMenuItem(
                                      value: value.get('name'),
                                      child: Text(
                                        '${value.get('name')}',
                                        overflow: TextOverflow.ellipsis,
                                      ),
                                    );
                                  }).toList(),
                                  onChanged: (value) {
                                    debugPrint('subCat selected: $value');
                                    setState(
                                      () {
                                        // Selected value will be stored
                                        subCategory = value;
                                        // Default dropdown value won't be displayed anymore
                                        setDefaultMakeModel = false;
                                      },
                                    );
                                  },
                                );
                              },
                            )
                          : Container(
                              child:
                                  Text('cat: $category subcat: $subCategory'),
                            ),
                    ),

I am trying to essentially create 2 dropdown within flutter that are populated via firebase streams. The idea is that a user can choose a category and the second dropdown will then show relevant sub categories based on the selected category. What happens is that I keep getting the following. My subcategories collection is nested within my categories collection

RangeError (RangeError (index): Invalid value: Valid value range is empty: 0)

 static Stream<QuerySnapshot> getCategories() {
    return catsRef.orderBy('name', descending: false).snapshots();
  }

  static Stream<QuerySnapshot> getSubCategories(category) {
    return catsRef
        .doc(category)
        .collection('sub-categories')
        .orderBy('name', descending: false)
        .snapshots();
  }



StreamBuilder<QuerySnapshot>(
                      stream: DatabaseService.getCategories(),
                      builder: (BuildContext context,
                          AsyncSnapshot<QuerySnapshot> snapshot) {
                        if (!snapshot.hasData) return Container();
                        if (setDefaultCategory) {
                          category = snapshot.data.docs[0].get('name');
                          debugPrint('setDefault category: $category');
                        }
                        return DropdownButton(
                          isExpanded: false,
                          value: category,
                          items: snapshot.data.docs.map((value) {
                            return DropdownMenuItem(
                              value: value.get('name'),
                              child: Text('${value.get('name')}'),
                            );
                          }).toList(),
                          onChanged: (value) {
                            debugPrint('selected onchange: $value');
                            setState(
                              () {
                                debugPrint('category selected: $value');
                                category = value;
                                setDefaultCategory = false;
                                setDefaultMakeModel = true;
                              },
                            );
                          },
                        );
                      },
                    ),
                    Container(
                      child: category != null
                          ? StreamBuilder<QuerySnapshot>(
                              stream:
                                  DatabaseService.getSubCategories(category),
                              builder: (BuildContext context,
                                  AsyncSnapshot<QuerySnapshot> snapshot) {
                                if (!snapshot.hasData) {
                                  debugPrint(
                                      'snapshot status: ${snapshot.error}');
                                  return Container(
                                    child: Text(
                                        'snapshot empty category: $category sub-category: $subCategory'),
                                  );
                                }
                                if (setDefaultMakeModel) {
                                  subCategory =
                                      snapshot.data.docs[0].get('name');
                                  debugPrint('setDefault subCat: $subCategory');
                                }
                                return DropdownButton(
                                  isExpanded: false,
                                  value: subCategory,
                                  items: snapshot.data.docs.map((value) {
                                    debugPrint('subCat: ${value.get('name')}');
                                    return DropdownMenuItem(
                                      value: value.get('name'),
                                      child: Text(
                                        '${value.get('name')}',
                                        overflow: TextOverflow.ellipsis,
                                      ),
                                    );
                                  }).toList(),
                                  onChanged: (value) {
                                    debugPrint('subCat selected: $value');
                                    setState(
                                      () {
                                        // Selected value will be stored
                                        subCategory = value;
                                        // Default dropdown value won't be displayed anymore
                                        setDefaultMakeModel = false;
                                      },
                                    );
                                  },
                                );
                              },
                            )
                          : Container(
                              child:
                                  Text('cat: $category subcat: $subCategory'),
                            ),
                    ),

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文