未来 <DropDownButton> 项 empty/null/same 值 |扑

Future<DropDownButton> items empty/null/same values | Flutter

在我的 web-application 过程中,我希望用户允许进行更改并保存它们。对于该过程,我使用 SharedPreferences 来存储更改。我有一个名为 konzernDataTitle 的标题列表。一般这个列表是用来显示我的头衔的。

为了更改某些内容,我编辑了此列表并将其“上传”到我的 SharedPreferences。但是,一切正常,但我无法将新列表 prefsKonzernTitle 放入我的 DropDownButton。为此,我正在使用 FutureBuilder。错误很简单:

══╡ EXCEPTION CAUGHT BY WIDGETS LIBRARY ╞═══════════════════════════════════════════════════════════
[...]
The following assertion was thrown building FutureBuilder<List<DropdownMenuItem<String>>>(dirty,
state: _FutureBuilderState<List<DropdownMenuItem<String>>>#dcca3):
Assertion failed:
items == null || items.isEmpty || value == null ||
              items.where((DropdownMenuItem<T> item) {
                return item.value == value;
              }).length == 1
"There should be exactly one item with [DropdownButton]'s value: MyTitle. \nEither zero or 2 or more
[DropdownMenuItem]s were detected with the same value"

The relevant error-causing widget was:
  FutureBuilder<List<DropdownMenuItem<String>>>

FutureBuilder 函数:

  Future<List<DropdownMenuItem<String>>> getDropDownItems() async {
    SharedPreferences prefs = await SharedPreferences.getInstance();
    bool prefsTitleExist;
    var newList = List<String>.empty();
    if (prefs.containsKey("prefsKonzernTitle")) {
      var getPrefList = prefs.getStringList("prefsKonzernTitle");
      newList = getPrefList!;
      prefsTitleExist = true;
    } else {
      prefsTitleExist = false;
    }
    final actualList = prefsTitleExist ? newList : konzernDataTitle;
    return actualList.map((data) {
      return DropdownMenuItem<String>(
        value: data,
        child: Text(
          data,
        ),
      );
    }).toList();
  }

FutureBuilder 小部件


FutureBuilder<List<DropdownMenuItem<String>>>(
                            future: getDropDownItems(),
                            builder: (context, snapshot) {
                              if (!snapshot.hasData) {
                                return const SizedBox();
                              }
                              return DropdownButton<String>(
                                value: dropdownValue,
                                items: snapshot.data,
                                onChanged: (String? newValue) {
                                  setState(() {
                                    dropdownValue = newValue!;
                                    i = konzernDataTitle.indexOf(newValue);
                                    titleController.text = konzernDataTitle[i];
                                    linkController.text = konzernDataLink[i];
                                    imageController.text = konzernDataImage[i];
                                    colorController.text =
                                        konzernDataColor[i].toString();
                                  });
                                },
                              );
                            }),


我在列表中搜索了问题,但所有列表都是它们必须的样子。 所以也许你可以帮助我。感谢您提供任何帮助。所有问题将在几分钟内得到解答。

^蒂姆

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

上述错误表示 dropdownValue 与下拉菜单项列表中的任何可用值都不匹配,或者 dropMenuItemList 中存在一个以上的值。

对于第一种情况,在初始化时设置 dropdownValue = null,对于第二种情况,检查菜单项没有重复。