繁体   English   中英

Flutter SQFlite从数据库填充一个下拉列表

[英]Flutter SQFlite populate a dropdown list from the database

我试图从我的SQFlite数据库中读取下拉列表的列表部分,但无法解决。

从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}\'');

}

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

  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;
        },
      ),

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

首先使用initStateonPressed中的RaisedButton

将此initState_loadAnimals方法放置在“ State小部件中。

  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>

  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();
  }

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM