Флаттер: выбранное значение не отображается в раскрывающемся списке - PullRequest
0 голосов
/ 24 сентября 2019

Я заполняю название города из базы данных 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 раз, вместо выпадающего списка).

Вопросы:

  1. Как я могу исправить эту проблему?
  2. Как установить значение по умолчанию из списка?(который будет выбран по умолчанию)

1 Ответ

1 голос
/ 24 сентября 2019

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

Вот как:

  1. Обновите свой getCitiesList() функция:

    Future<List<String>> getCitiesList() async {
      Database db = await instance.database;
    
      final citiesData = await db.query(tblCities);
    
      if (citiesData.length == 0) return null;
    
      return citiesData.map((Map<String, dynamic> row) {
        return row["name"] as String;
      }).toList();
    }
    
  2. Добавьте это на странице формы:

    //initialize these at top
    List<String> _citiesList = <String>[];
    String _city;
    
    void _getCitiesList() async {
      final List<String> _list = await databaseHelper.getCitiesList();
      setState(() {
        _citiesList = _list;
      });
    }
    
  3. Звоните _getCitiesList(); внутри initState().

  4. Добавьте это в ваш build метод:

    DropdownButtonHideUnderline(
        child: DropdownButton<String>(
          value: _city,
          items: _citiesList.map((String value) {
            return DropdownMenuItem<String>(
              value: value,
              child: Text(value),
            );
          }).toList(),
          onChanged: (String newValue) {
          setState(() {
              _city = newValue;
          });
          },
    )),
    
...