Flutter DropdownButton - заполнять элементы из остальных веб-сервисов - PullRequest
3 голосов
/ 05 марта 2019

Мой fetchCities() метод возвращает Future<List<City>> и загружает данные из остальных веб-сервисов.Код для заполнения элементов:

 Widget buildCitiesSelector(){

    return new Center(
        child: FutureBuilder(
            future: fetchCities() ,
            builder: (context, snapshot){
              if (snapshot.hasData) {
                return new DropdownButton <City>(
                    hint: Text('Wybierz miasto'),
                  items: snapshot.data.map<DropdownMenuItem<City>>((City value) {
                    return DropdownMenuItem<City>(
                      value: value,
                      child: Text(value.name),
                    );
                  }).toList(),
                  onChanged: (value) {
                      setState(() {_selectedCity = value;});
                  },
                  value: _selectedCity,
                );
              }
              else{
                return CircularProgressIndicator();
              }
            }

        )

    );
  }

Результат: элементы правильно отображаются в селекторе.Тем не менее, при выборе какого-либо конкретного элемента, я получаю исключение:

I / flutter (13910): ══╡ ИСКЛЮЧЕНИЕ ЗАДЕРЖАНО БИБЛИОТЕКОЙ ВИДЖЕТОВ ════════════════════════════════════════════════════════════ I /flutter (13910): было сгенерировано следующее утверждение при создании FutureBuilder> (грязный, состояние: I / flutter (13910): _FutureBuilderState> # dacd9): I / flutter (13910): 'package: flutter / src / material / dropdown.dart': Неудачное утверждение: строка 560 поз 15:' items == null ||I / флаттер (13910): items.isEmpty ||значение == ноль ||items.where ((DropdownMenuItem item) => item.value == I / flutter (13910): значение) .length == 1 ': неверно.

Как правильно выбрать элемент?Есть идеи что не так?

Ответы [ 2 ]

0 голосов
/ 10 апреля 2019

У меня была та же проблема сегодня, и после некоторого поиска я обнаружил ошибку в своем коде: значение в DropdownButton не было в списке элементов.

Я предположил (ошибочно), что раскрывающийся списокбудет обрабатывать «пустое» значение - но это не так.

0 голосов
/ 05 марта 2019

Вы не должны использовать FutureBuilder для этой ситуации.Скорее извлеките данные в initState(), а затем вызовите перестройку, используя setState() для обновления представления.

Если fetchCities() создает новый Future каждый раз, когда он вызывается, то build() вызоветкоторые выбирают каждый раз, когда пользовательский интерфейс перестраивается (что может быть довольно часто)

https://docs.flutter.io/flutter/widgets/FutureBuilder-class.html

Будущее должно быть получено раньше, например, во время State.initState, ...

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