我正在开发一个小部件,其中包含dropdownbutton
在颤振中。该小部件创建dropdownmenuitems
向用户传入的 url 发出请求后。
我已经看到正在拨打的电话和有效的响应,但是当我使用setState
要更新下拉列表的数据源,我收到以下错误:
'package:flutter/src/material/dropdown.dart': 断言失败: 第 560 行 pos 15: 'items == null ||
我/颤振(11514):items.isEmpty ||值==空|| items.where((DropdownMenuItem item) => item.value ==
I/flutter (11514): value).length == 1': 不正确。
我尝试研究这个错误,但没有找到有用的答案。代码如下:
class _MyWidgetState extends State<MyWidget> {
List<DropdownMenuItem<String>> _data = [];
String _selected = '';
@override
void initState() {
super.initState();
_loadData();
}
void _loadData() async {
if (widget.urlToFetchData.isNotEmpty) {
var response = await http.get(widget.urlToFetchData);
if (response.statusCode == 200) {
Map<String, dynamic> jsonResponse = convert.jsonDecode(response.body);
jsonResponse.forEach((key, value){
setState(() {
this._data.add(new DropdownMenuItem(
child: new Text(value.toString()),
value: value.toString(),
));
});
});
} else {
print("Request failed with status: ${response.statusCode}.");
}
}
}
}
@override
Widget build(BuildContext context) {
if (_data.length == 0) {
return new Container();
} else {
return Column(
children: <Widget> [
new Text(
widget.dropdownLabelTitle
),
DropdownButton(
value: _selected,
items: _data,
hint: new Text(widget.defaultOptionText),
onChanged: (value) {
_selected = value;
widget.valueReturned(_selected);
setState(() {
});
}
)
],
);
}
}
}
现在,我完全知道在小部件初始化时,下拉按钮中的项目字段是用空列表初始化的,但我认为通过在 http 调用完成时调用 setState ,这将更新该值。
我尝试了不同的更新数据的方法(通过创建本地列表,然后使用addAll
或者只是通过分配),但我得到了同样的错误。
有人知道如何解决这个问题吗?