【问题标题】:Flutter SQFlite populate a dropdown list from the databaseFlutter SQFlite 从数据库中填充下拉列表
【发布时间】:2019-05-19 11:14:12
【问题描述】:

我正在尝试从我的 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;
        },
      ),

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

【问题讨论】:

  • 您好像忘记给getFieldData打电话了,您尝试过initState() { getFieldData().then(() { setState(() =&gt; _animals = ..yourStuff..); }); }吗?
  • 您是否还注意到您正在返回List&lt;Map&gt; 而您正在执行_animals.map((String) ...)
  • 我没有包含对函数的调用。使用 _animals.map() 的下拉列表只是具有这 3 个已知值的静态下拉列表,我需要能够从数据库中填充其他值。
  • 我不确定在哪里调用类似 List _breeds = await db.getFieldData('CATTLE','Breed1') 它提到的不能分配 Future>键入 List 我需要使用 FutureBuilder 吗?我是新来的。我以为我可以只返回一个字符串类型的列表

标签: flutter


【解决方案1】:

首先使用initStateRaisedButtononPressed 中的调用。

将此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&lt;String&gt; 而不是List&lt;Map&gt;

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

【讨论】:

  • 谢谢你,这为我解决了问题。我正在关注一个使用 Future> 的 sqflite 示例,返回下拉列表值的字符串列表要简单得多。
  • 不客气,如果您认为它有帮助,请不要忘记接受作为答案。干杯
  • 我得到的方法 .map() 没有为未来类型定义。尝试将 .map() 放在我的数据上时
猜你喜欢
  • 2020-03-07
  • 2011-11-09
  • 2014-12-25
  • 2020-04-08
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多