在 Flutter 中更新下拉数据出现错误

tom*_*fic 3 asynchronous widget dart dropdown flutter

我正在开发一个dropdownbutton由 Flutter 组成的小部件。该小部件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(() {

                        });
                     }
                   )
                ],
              );
            }
       }
    }
Run Code Online (Sandbox Code Playgroud)

现在,我完全知道在小部件初始化时,下拉按钮中的项目字段是用空列表初始化的,但我认为通过在 http 调用完成时调用 setState ,这将更新该值。

我尝试了不同的更新数据的方法(通过创建本地列表,然后使用addAll或仅通过分配),但我得到了相同的错误。

有人知道如何解决这个问题吗?

Nut*_*uts 7

您收到此错误是因为下拉菜单尝试选择不存在的项目。

DropdownButton(
        value: _selected, # < here you are trying to select `String _selected = '';`
        items: _data,
Run Code Online (Sandbox Code Playgroud)

要解决这个简单的问题,value请将其删除或设置在某处。