Я заполняю название города из базы данных SQLite и пытаюсь отобразить его в раскрывающемся списке.Я заставляю его работать, следуя инструкциям, но с небольшой проблемой.Выбранное значение не отображается в раскрывающемся списке, оно продолжает отображать значение подсказки по умолчанию.Однако я смог назначить и получить правильное выбранное значение.
Вот мой код:
cities.dart
class Cities {
int id;
String name;
Cities(this.id, this.name);
Cities.fromMap(Map<String, dynamic> json) {
this.id = json["id"];
this.name = json["name"];
}
Map<String, dynamic> toMap() => {
'id': null,
'name': name,
};
}
Function
который извлекает и возвращает значение из db:
Future<List<Cities>> getCitiesList() async {
Database db = await instance.database;
final citiesData = await db.query('cities');
if (citiesData.length == 0) return null;
List<Cities> citiesList = citiesData.map((item) {
return Cities.fromMap(item);
}).toList();
return citiesList;
}
Код, который строит выпадающий, внутри Widget build
:
//these are defined above in the code
Cities _city;
final databaseHelper = DatabaseHelper.instance;
FutureBuilder<List<Cities>>(
future: databaseHelper.getCitiesList(),
builder: (BuildContext context, AsyncSnapshot<List<Cities>> snapshot) {
if (!snapshot.hasData) return CircularProgressIndicator();
return DropdownButton<Cities>(
items: snapshot.data
.map((city) => DropdownMenuItem<Cities>(
child: Text(city.name),
value: city,
))
.toList(),
onChanged: (Cities value) {
setState(() {
_city = value;
});
},
isExpanded: true,
// value: _city, //uncommenting this line breaks the layout
hint: Text('Select City'),
);
},
),
Ошибка в консоли:
'package:flutter/src/material/dropdown.dart': Failed assertion: line 620 pos 15: 'items == null || items.isEmpty || value == null || items.where((DropdownMenuItem<T> item) => item.value == value).length == 1': is not true.
Не комментируя это value: _city,
добавить ту же ошибку на дисплее (отображает ошибку 8 раз, вместо выпадающего списка).
Вопросы:
- Как я могу исправить эту проблему?
- Как установить значение по умолчанию из списка?(который будет выбран по умолчанию)