我添加了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,
),
),
),
您可以使用indexOf()
的List
函数获取选择的索引。例如,给出您的代码:
onChanged: (value) {
int index = workTypes.indexOf(value);
setState(() => _workTypes = value);
},
请注意,indexOf()
会从列表中返回第一个匹配元素的索引,因此如果您有重复的字符串,则会得到错误的索引。
一个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,
),