[英]Flutter SQFlite populate a dropdown list from the database
I am trying to read the list part of a dropdown list from my SQFlite database, and can't work out how. 我试图从我的SQFlite数据库中读取下拉列表的列表部分,但无法解决。
Query from database_helper 从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'];
to populate this dropdown list 填充此下拉列表
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 它是表单上几个字段的一部分
Start by using the call in the initState
or in a onPressed
of a RaisedButton
. 首先使用
initState
或onPressed
中的RaisedButton
。
Place this initState
and _loadAnimals
method in your State
Widget. 将此
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();
});
}
Or you could change the getFieldData
to return a List<String>
instead of a List<Map>
: 或者,您可以更改
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.