Flutter SQFlite从数据库填充一个下拉列表 [英] Flutter SQFlite populate a dropdown list from the database

查看:44
本文介绍了Flutter SQFlite从数据库填充一个下拉列表的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在尝试从我的SQFlite数据库中读取下拉列表的列表部分,但无法解决.

I am trying to read the list part of a dropdown list from my SQFlite database, and can't work out how.

从database_helper查询

Query from database_helper

Future<List<Map>> getFieldData(String animal, String fieldName)
 var dbClient = await db;

return await dbClient.rawQuery('SELECT lbOption FROM jkAssessData Where lbAnimal = \'${animal}\' AND lbField = \'${fieldName}\'');

}

我可以将其与静态值列表一起使用

I can get it to work with a static list of values

  final List<String> _animals = <String>['CATTLE', 'SHEEP', 'GOAT'];

填充此下拉列表

      FormField<String>(
        builder: (FormFieldState<String> state) {
          return InputDecorator(
            decoration: InputDecoration(
              labelText: 'Animal Type',
              errorText: state.hasError ? state.errorText : null,
            ),
            isEmpty: _animal == '',
            child: DropdownButtonHideUnderline(
              child: DropdownButton<String>(
                value: _animal,
                isDense: true,
                onChanged: (String newValue) {
                  setState(() {
                    assessHed.asAnimal = newValue;
                    _animal = newValue;
                    state.didChange(newValue);
                  });
                },
                items: _animals.map((String value) {
                  return DropdownMenuItem<String>(
                    value: value,
                    child: Text(value),
                  );
                }).toList(),
              ),
            ),
          );
        },
        validator: (val) {
          //return val != 'SUMMARY' ? 'DETAIL' : 'Please select Type';
          return null;
        },
      ),

它是表单上几个字段的一部分

It's part of several fields on a Form

推荐答案

首先使用 initState RaisedButton .

将此 initState _loadAnimals 方法放在您的 State 小部件中.

Place this initState and _loadAnimals method in your State Widget.

  List<String> _animals = <String>[];

  @override
  initState() {
    super.initState();

    // when loading your widget for the first time, loads animals from sqflite
    _loadAnimals();
  }

  _loadAnimals() async {
    // gets data from sqflite
    final loadedAnimals = await getFieldData('CATTLE','Breed1');
    setState(() {
      // converts sqflite row data to List<String>, updating state
      _animals = loadedAnimals.map((Map<dynamic, dynamic> row) => row["lbOption"] as String).toList();
    });
  }

或者您可以更改 getFieldData 以返回 List< String> 而不是 List< Map> :

Or you could change the getFieldData to return a List<String> instead of a List<Map>:

  Future<List<String>> getFieldDataAsString(String animal, String fieldName) async {
    var dbClient = await db;

    var results = await dbClient.rawQuery('SELECT lbOption FROM jkAssessData Where lbAnimal = \'$animal\' AND lbField = \'$fieldName\'');

    return results.map((Map<String, dynamic> row) {
      return row["lbOption"] as String;
    }).toList();
  }

这篇关于Flutter SQFlite从数据库填充一个下拉列表的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆