Обновление выпадающих данных во флаттере выдает ошибку - PullRequest
0 голосов
/ 08 мая 2019

Я нахожусь в процессе разработки виджета, который состоит из dropdownbutton в Flutter. Этот виджет создает dropdownmenuitems после отправки запроса на URL, который передал пользователь.

Я видел, как выполнялся вызов и действительный ответ, но когда я использую setState для обновления источника данных для раскрывающегося списка, я получаю следующую ошибку:

'package: flutter / src / material / dropdown.dart': ошибочное утверждение: строка 560, позиция 15: 'items == null || I / флаттер (11514): items.isEmpty || значение == ноль || items.where ((DropdownMenuItem item) => item.value == I / флаттер (11514): значение). Длина == 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(() {

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

Теперь я полностью осознаю, что при инициализации виджета поле элементов в выпадающем меню инициализируется пустым списком, но я подумал, что при вызове setState после завершения http-вызова это обновит значение.

Я пробовал разные способы обновления данных (создавая локальный список и затем используя addAll или просто по назначению), но я получаю ту же ошибку.

Кто-нибудь знает, как решить эту проблему?

Ответы [ 2 ]

1 голос
/ 09 мая 2019

Ваша проблема действительно вызвана значением _selected.Он должен быть в списке DropdownMenuItem, так что в вашем случае первое значение - пустая строка, и нет никаких элементов, так что все в порядке, но когда вы получаете значения из API, нет DropdownMenuItem, который имеет value=='', поэтому исправлением будет инициализация _selected с первым значением, полученным от API.Также вы должны setState за пределами цикла for.Как то так:

setState(() {
      jsonResponse.forEach((key, value) {
        if (_selected.isEmpty) {
          _selected = value;
        }
        this._data.add(new DropdownMenuItem(
              child: new Text(value.toString()),
              value: value.toString(),
            ));
      });
    });
1 голос
/ 08 мая 2019

Вы получаете эту ошибку, потому что выпадающее меню пытается выбрать элемент, который не существует.

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

Чтобы решить эту простую проблему, удалите value или установите его где-нибудь.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...