Updating Dropdown Data In Flutter Gives Error

我只是一个虾纸丫 提交于 2019-12-24 07:46:00

问题


I am in the process of developing a widget that consists of a dropdownbutton in Flutter. This widget creates dropdownmenuitems after making a request to a url the user has passed in.

I have seen the call being made and the response being valid, but when I use setState to update the data source for the dropdown I get the following error:

'package:flutter/src/material/dropdown.dart': Failed assertion: line 560 pos 15: 'items == null || I/flutter (11514): items.isEmpty || value == null || items.where((DropdownMenuItem item) => item.value == I/flutter (11514): value).length == 1': is not true.

I tried researching this error and found no helpful answers. The code is below:

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(() {

                        });
                     }
                   )
                ],
              );
            }
       }
    }

Now, I am fully aware the at the initialization of the widget, the items field in the dropdownbutton is initialized with an empty list, but I thought that by calling setState when the http call finishes, that will update the value.

I have tried different methods of updating the data(by creating a local list and then using addAll or just by assignment), but I get the same error.

Anyone know how to solve this issue?


回答1:


You are getting this error because dropdown menu is trying to select item that does not exists.

DropdownButton(
        value: _selected, # < here you are trying to select `String _selected = '';`
        items: _data,

To solve this simple remove value or set it somewhere.




回答2:


Your problem is caused indeed by the _selected value. It has to be in the list of DropdownMenuItem so in your case the first value is an empty string and there are no items so that's ok, but when you get the values from the API there is no DropdownMenuItem that has the value=='' so the fix would be to init the _selected with the first value received from the API. Also you should setState outside the for loop. Something like this:

setState(() {
      jsonResponse.forEach((key, value) {
        if (_selected.isEmpty) {
          _selected = value;
        }
        this._data.add(new DropdownMenuItem(
              child: new Text(value.toString()),
              value: value.toString(),
            ));
      });
    });


来源:https://stackoverflow.com/questions/56047538/updating-dropdown-data-in-flutter-gives-error

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!