Flutter-将SQLite表解析为数据表

时间:2019-11-08 17:13:04

标签: flutter dart sqflite

我正在尝试将一些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小部件,但是我还是很陌生,并且状态管理的概念仍然存在对我来说陌生。

1 个答案:

答案 0 :(得分:0)

您可以使用提供程序进行状态管理。在下拉选择中,更新数据并通知提供者中的侦听器。