Flutter - Зависимый / многоуровневый DropdownButton имеет проблему: должен быть ровно один элемент со значением [DropdownButton]: Мази - PullRequest
1 голос
/ 06 апреля 2020

Если кто-то может помочь мне с этим вопросом. Так что я могу получить и вставить в выпадающие кнопки, используя код ниже. Если я выберу первый выпадающий список, то список отобразится соответственно для второго выпадающего списка, а если я выберу другое значение, список изменится. Но когда я выбираю между списками более одного раза, это выдает мне ошибку, например:

Было выдано другое исключение: должен быть ровно один элемент со значением [DropdownButton]: Мази.

Обнаружены либо ноль, либо 2, либо более [DropdownButton] с тем же значением.

Я предполагаю, что это потому, что я вызываю функции внутри onChanged: из кнопок. Любая помощь приветствуется. Спасибо!

примечание: я также поместил только функцию dynamicDropDownMainCategory () в initState.

//FIRST DROPDOWNBUTTON BELOW
//

child: DropdownButton<String>(
                            hint: Text('Select Category'),
                            icon: Icon(Icons.keyboard_arrow_down),
                            iconSize: 28,
                            isDense: true,
                            isExpanded: true ,
                            elevation: 16,
                            style: TextStyle(
                              color: Colors.black,
                              fontSize: 16.0,
                            ),
                            value: categoryManualCurrent.isNotEmpty ? categoryManualCurrent : null,
                            onChanged: (String categoryValue) async {

                             //  await dynamicDropDownMainCategory();

                              setState(() {

                                mainCategoryCurrent = categoryValue;
                                categoryManualCurrent = categoryValue;

                              }); 

                                        print('THIS' + categoryManual.toString());
                                        print('THAT' + subCategoryManual.toString());

                                await dynamicDropDownSubCategory();
                            },
                            items: categoryManual.toList()
                              .map((var value3) {
                                return  DropdownMenuItem<String>(
                                  value: value3,
                                  child: Text(value3),
                                );
                               }).toList(),
                             ),
                           )   
                          ],
                          ),


                    //SECOND DROPDOWNBUTTON BELOW
                    //

                          child: DropdownButton<String>(
                            hint: Text('Select subCategory'),
                            icon: Icon(Icons.keyboard_arrow_down),
                            iconSize: 28,
                            isDense: true,
                            isExpanded: true ,
                            elevation: 16,
                            style: TextStyle(
                              color: Colors.black,
                              fontSize: 16.0,
                            ),

                            value: subCategoryManualCurrent.isNotEmpty ? subCategoryManualCurrent : null,
                            onChanged: (String subCategoryValue) async {

                            //await dynamicDropDownMainCategory();
                             await dynamicDropDownSubCategory();

                                subCategoryCurrent = subCategoryValue;
                               setState(() {
                                 subCategoryManualCurrent = subCategoryValue;
                               }); 

                            //   await  dynamicDropDownSubCategory();

                            },
                              items: subCategoryManual.toList()
                              .map((var value1) {
                                return DropdownMenuItem<String>(
                                  value: value1,
                                  child: Text(value1),
                                );
                               }).toList(),
                             ),
                           ),
                      ]
                          ),


//TWO functions im using to call the list data from firestore and insert into the //dropdownbutton

 Future dynamicDropDownMainCategory() async{

      await Firestore.instance

              .collection('Products')
              .document('Categories')                                    
              .get()                                                             
              .then((snapshot) => {  

              categoryManual = (snapshot.data['mainCategory']),

              }
              );
             }


    Future dynamicDropDownSubCategory() async{

          await Firestore.instance

              .collection('Products')
              .document('Categories')                                    
              .get()                                                             
              .then((snapshot) => {  

    if (mainCategoryCurrent == categoryManualCurrent){
              subCategoryManual = (snapshot.data['subCategory'+' '+mainCategoryCurrent]),

           } else {

            subCategoryManual = ['Error Getting Data'],

              }
              }
          );
    }

1 Ответ

0 голосов
/ 07 апреля 2020

эта ошибка возникает, когда у вас есть две строки, которые равны, и вы устанавливаете в качестве значения dropdowmbutton, так как он должен быть уникальным:

return DropdownMenuItem(
  value: data.categoryName,
  child: Text(data.categoryName, style: Constants.normalLarge),
);

в приведенном выше примере значение свойства должно быть уникальным, чтобы может сделать соответствующий элемент.

...