未来 <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
,对于第二种情况,检查菜单项没有重复。
在我的 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
,对于第二种情况,检查菜单项没有重复。