【发布时间】:2019-09-26 14:07:32
【问题描述】:
我正在开发一个由 Flutter 中的 dropdownbutton 组成的小部件。此小部件在向用户传入的 url 发出请求后创建 dropdownmenuitems。
我已经看到正在进行调用并且响应有效,但是当我使用 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(() {
});
}
)
],
);
}
}
}
现在,我完全知道在小部件的初始化时,下拉按钮中的 items 字段被初始化为一个空列表,但我认为通过在 http 调用完成时调用 setState 来更新值。
我尝试了不同的数据更新方法(通过创建本地列表,然后使用addAll 或仅通过赋值),但我得到了同样的错误。
有人知道如何解决这个问题吗?
【问题讨论】:
-
_selected 的初始值为
' ',因此它必须存在具有该值的 DropDownMenuItem。你确定,你有吗? -
在下拉按钮项目列表更新时将
null传递给_selected。
标签: asynchronous dart flutter widget dropdown