如何阅读下拉列表中选择的索引ID?

问题描述 投票:0回答:1

我添加了DropDownButton。它运作良好。来自缓存的数据。如何获取选定的描述ID(id表示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,
              ),
            ),
          ),
drop-down-menu dart flutter dropdown
1个回答
0
投票

您可以使用indexOf()List函数获取选择的索引。例如,给出您的代码:

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

请注意,indexOf()会从列表中返回第一个匹配元素的索引,因此如果您有重复的字符串,则会得到错误的索引。

Edit after question clarification

一个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,
),
© www.soinside.com 2019 - 2024. All rights reserved.