Как прочитать выпадающий список выбранного индекса? - PullRequest
0 голосов
/ 17 апреля 2019

Я добавил DropDownButton. Работает хорошо. Данные поступают из кеша. Как получить выбранный идентификатор описания (идентификатор означает i)

Future<List<DataWorkTypes>> displayWorkTypes() async {
    var db = await db1;
    final List<Map<String, dynamic>> maps = await db.query('WorkTypesTable');

    return List.generate(maps.length, (i) {
      return DataWorkTypes(i: maps[i]['i'], d: maps[i]['d']);
    });
  }

Мне нужно получить i

  @override
  void initState() {
    getWorkTypes().then((result) {
      setState(() {
        workTypes = result;
      });
    });
  }

  Future getWorkTypes() async {
    List workType = (await HelperDatabase1().displayWorkTypes());
    for (int i = 0; i < workType.length; i++) {
      workTypes.add(workType[i].d);
    }
    return workTypes;
  }



Container(
            child: ButtonTheme(
              alignedDropdown: true,
              child: DropdownButton<String>(
                isExpanded: true,
                value: _workTypes,
                items: workTypes.map((String value) {
                  return DropdownMenuItem<String>(
                    value: value,
                    child: Text(
                      value,
                      overflow: TextOverflow.ellipsis,
                    ),
                  );
                }).toList(),
                onChanged: (value) => setState(() => _workTypes = value),
                style: Theme.of(context).textTheme.title,
              ),
            ),
          ),

1 Ответ

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

Вы можете получить индекс выбора, используя функцию indexOf() a List.Например, учитывая ваш код:

onChanged: (value) {
  int index = workTypes.indexOf(value);
  setState(() => _workTypes = value);
},

Просто имейте в виду, что indexOf() возвращает индекс первого соответствующего элемента из списка, поэтому, если у вас есть повторяющиеся строки, вы получитенеправильный индекс.

Редактировать после уточнения вопроса

A DropdownMenuItem может принимать значение объекта и при этом отображать только String.Для приведенного выше кода начните с изменения типа _workTypes на DataWorkTypes и workTypes на List<DataWorkTypes>.Ваш код будет выглядеть примерно так:

@override
void initState() {
  HelperDatabase1().displayWorkTypes().then((result) {
    setState(() {
      workTypes = result;
    });
  });
}

child: DropdownButton<DataWorkTypes>(
  isExpanded: true,
  value: _workTypes,
  items: workTypes.map((DataWorkTypes value) {
    return DropdownMenuItem<DataWorkTypes>(
      value: value,
      child: Text(
        value.d, // same label as before
        overflow: TextOverflow.ellipsis,
      ),
    );
  }).toList(),
  onChanged: (value) => setState(() {
    int index = value.i; // here is your index
    _workTypes = value;
  }),
  style: Theme.of(context).textTheme.title,
),
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...