Как устранить трепет dropdownButtonFormField dynamici c выбор проверки для значения dropdownButton - PullRequest
0 голосов
/ 03 мая 2020

Я пытаюсь попросить пользователя выбрать тип элемента в первом раскрывающемся списке, а затем выбрать из его соответствующих доступных цветов во втором раскрывающемся списке. Однако, когда после того, как я выбрал цвет (т.е. белый) и теперь хочу переключиться на другой элемент, который не имеет этого цвета, выдается ошибка:

"There should be exactly one item with [DropdownButton]'s value: white. \nEither zero or 2 or more
[DropdownMenuItem]s were detected with the same value"

Пожалуйста, помогите, я уже пытался setState в разных местах для обновления значений, но эта ошибка все еще возникает.

Ниже приведен мой фрагмент кода:

                    StreamBuilder<QuerySnapshot>(
                      stream: mainItemsSnapshots,
                      builder: (context, snapshot) {
                        if (snapshot.hasError) return Text("Error");
                        switch (snapshot.connectionState) {
                          case ConnectionState.waiting:
                            return Center(child: CircularProgressIndicator());
                          default:
                            {
                              List<DropdownMenuItem> dropdownMenuItems =
                                  snapshot.data.documents
                                      .map((DocumentSnapshot mainItem) {
                                return new DropdownMenuItem<String>(
                                  value: mainItem.documentID,
                                  child: Text(mainItem.documentID),
                                );
                              }).toList();
                              return DropdownButtonFormField<String>(
                                items: dropdownMenuItems,
                                onChanged: (String value) {
                                    if (value != tempMainItemType) {
                                      setState(() {
                                        tempMainItemType = value;
                                        tempItemColorsList.clear();
                                        tempItemColorsList = [];
                                        tempMainItemColor = null;
                                      });
                                    }

                                  if (tempItemColorsList.isEmpty && value != null) {
                                    tempItemColorsList = snapshot.data.documents
                                        .where((element) => element.documentID == value)
                                        .first
                                        .data["colors"]
                                        .keys
                                        .map((color) => color.toString())
                                        .toList()
                                        .cast<String>();
                                  }
                                  setState((){});
                                },
                                onSaved: (String value) {
                                  _order.mainItemType = value;
                                },
                                value: tempMainItemType,
                              );
                            }
                        }
                      },
                    ),

                    // Main color
                    if (tempItemColorsList?.isNotEmpty)
                      Padding(
                        padding: const EdgeInsets.only(top: spacingGeneral),
                        child: textFieldLabel(context, "Main color"),
                      ),
                    if (tempItemColorsList?.isNotEmpty)
                      DropdownButtonFormField(
                        items: tempItemColorsList.map((String color) {
                          return new DropdownMenuItem<String>(
                            value: color,
                            child: Text(color),
                          );
                        }).toList(),
                        onSaved: (String value) {
                          _order.mainColor = value;
                        },
                        value: tempMainItemColor,
                        onChanged: (String value) {
                          setState(() {
                            tempMainItemColor = value;
                          });
                        },
                      ),
...