Flutter DropDownButton, использующий FutureBuilder для ответа JSON - PullRequest
1 голос
/ 29 июня 2019

Я пытался закодировать это приложение с помощью Flutter, и я хочу создать выпадающую кнопку, которая отображает значения, полученные из ответа JSON API, созданного с помощью Django.

Ответ JSON выглядит следующим образом:

[{"name": "FC1", "username": "admin"}, {"name": "FC2", "username": "admin"}]

Это используемый класс Object,

class FoodCourt {
  final String name;
  FoodCourt(this.name);
}

Это метод, используемый для получения данных,

Future<List<FoodCourt>> _getFoodCourt() async {
 var data = await http
     .get("http://timetable-api-manipal.herokuapp.com/getfoodcourt");
 var jsonData = json.decode(data.body);

 List<FoodCourt> fcs = [];

 for (var u in jsonData) {
   FoodCourt fc = FoodCourt(u["name"]);
   fcs.add(fc);
 }
 print(fcs);
 return fcs;
} 

и это виджет FutureBuilder, который я использовал,

FutureBuilder(
          future: _getFoodCourt(),
          builder: (context, snapshot) {
            return DropdownButton<String>(
                hint: Text("Select"),
                value: selectedFc,
                onChanged: (newValue) {
                  setState(() {
                    selectedFc = newValue;
                  });
                },
                items: snapshot.data.map((fc) {
                  return DropdownMenuItem<String>(
                    child: Text(fc.name),
                    value: fc.name,
                  );
                }));
          }),

Показанная ошибка:

I/flutter (31862): ══╡ EXCEPTION CAUGHT BY WIDGETS LIBRARY ╞═══════════════════════════════════════════════════════════

I/flutter (31862): The following assertion was thrown building FutureBuilder<List<FoodCourt>>(dirty, state:
I/flutter (31862): _FutureBuilderState<List<FoodCourt>>#3c097):
I/flutter (31862): type 'MappedListIterable<FoodCourt, 
DropdownMenuItem<FoodCourt>>' is not a subtype of type
I/flutter (31862): 'List<DropdownMenuItem<FoodCourt>>'

Я пробовал много разных способов решить эту проблему, и этот, казалось, имел для меня наибольшее значение, и все же он не работает. Было бы очень полезно, если бы кто-то мог напечатать пример кода для рабочего решения!

Ответы [ 2 ]

2 голосов
/ 29 июня 2019

Вы должны установить буксировку первым согласно @ saed's answer

items: snapshot.data.map((fc) =>
       DropdownMenuItem<String>(
        child: Text(fc.name),
        value: fc.name,
      )
    ).toList();

и Вторым делом на FutureBuilder установить тип как

FutureBuilder<List<FoodCourt>>(..... Your code
2 голосов
/ 29 июня 2019

Ваши товары не в списке, используйте этот код:

items: snapshot.data.map((fc) =>
       DropdownMenuItem<String>(
        child: Text(fc.name),
        value: fc.name,
      )
    ).toList();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...