在 Flutter 中更新下拉数据会出错
Posted
技术标签:
【中文标题】在 Flutter 中更新下拉数据会出错【英文标题】:Updating Dropdown Data In Flutter Gives Error 【发布时间】: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
。
【参考方案1】:
您收到此错误是因为下拉菜单试图选择不存在的项目。
DropdownButton(
value: _selected, # < here you are trying to select `String _selected = '';`
items: _data,
要解决这个简单的问题,请删除 value
或将其设置在某处。
【讨论】:
当我在解析 json 后删除setState
语句时,我没有收到错误消息。为什么这会解决我的问题?首次执行构建方法时,selected
也是空的,我没有收到错误。
如果_data
和_selected
为空,则不会出现任何错误。
@Nuts 将其设置为value
是什么意思。我们应该把value
准确地放在哪里。【参考方案2】:
您的问题确实是由_selected
值引起的。它必须在DropdownMenuItem
的列表中,因此在您的情况下,第一个值是空字符串并且没有项目,所以没关系,但是当您从 API 获取值时,没有 DropdownMenuItem
具有 @ 987654324@ 所以解决方法是使用从 API 接收到的第一个值来初始化 _selected
。你也应该在for
循环之外使用setState
。像这样的:
setState(()
jsonResponse.forEach((key, value)
if (_selected.isEmpty)
_selected = value;
this._data.add(new DropdownMenuItem(
child: new Text(value.toString()),
value: value.toString(),
));
);
);
【讨论】:
【参考方案3】:这将是可行的。您必须在数组和值中插入至少一个数据。
List<DropdownMenuItem<String>> _data = ['Select One'];
String _selected = _data[0];
或者你可以这样做---->
List<DropdownMenuItem<String>> _data = [];
String _selected = '';
_data.length > 0 ? DropdownButton(
value: _selected,
items: _data,
hint: new Text(widget.defaultOptionText),
onChanged: (value)
_selected = value;
widget.valueReturned(_selected);
setState(()
);
) : Container();
【讨论】:
以上是关于在 Flutter 中更新下拉数据会出错的主要内容,如果未能解决你的问题,请参考以下文章