我正在尝试将一些sql数据解析为DataTable小部件。我有一个查询特定表中所有字段并将键和值转换为列表的函数。
//Returns every field in each table
_queryTable(tableName) async {
Database db = await DatabaseHelper.instance.database;
List<Map> result = await db.rawQuery('SELECT * FROM $tableName');
result.forEach((map) {
var keys = map.keys;
var values = map.values;
keys.toList();
values.toList();
print('List of Keys: $keys');
print('List of Values: $values');
});
}
然后,我有一个名为buildDataTable的小部件,该小部件将键和字符串的列表作为参数,并将键映射到列,将值映射到行。
Widget buildDataTable(List<String> keys, List<String> values) {
try {
return DataTable(columns: keys.map((columnName) => DataColumn(label: Text(columnName))), rows: [
DataRow(
cells: values.map((value) => DataCell(Text(value))),
),
]);
} catch (err) {
print(err);
}
}
当用户从下拉菜单中选择所需的表时,如何在主体中构建DataTable?
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text('SQFLite Utility'),
actions: <Widget>[
DropdownButton(
value: tables.first,
icon: Icon(
Icons.arrow_downward,
color: Colors.white,
),
iconSize: 24,
elevation: 16,
style: TextStyle(color: Colors.black),
underline: Container(
height: 2,
color: Colors.white,
),
onChanged: (_tableName) {
_queryTable(_tableName);
setState(() {
dropdownValue = _tableName;
});
},
items: tables.map<DropdownMenuItem<String>>((value) {
return DropdownMenuItem<String>(
value: value,
child: Text(
value,
style: TextStyle(color: Colors.black),
),
);
}).toList(),
),
],
),
body: buildDataTable(keys, values),
);
}
我假设我必须在某个地方使用setState,因为每次用户从下拉列表中选择不同的表时都需要重新构建DataTable小部件,但是我还是很陌生,并且状态管理的概念仍然存在对我来说陌生。
答案 0 :(得分:0)
您可以使用提供程序进行状态管理。在下拉选择中,更新数据并通知提供者中的侦听器。