调用Sqflite函数时,将Future <List <String >>转换为List <String>

时间:2019-07-10 18:57:24

标签: sqlite flutter dart

我想从数据库中获取所有项目,但是我被困在如何将Future字符串列表转换为字符串列表中。

var x =  DataBaseHelper.instance.queryAllRows();


 Future<List<String>> queryAllRows() async {
    Database db = await instance._initDatabase();
    List<Map<String,dynamic>> s =  await db.query(table ,columns: [columnname]);
    List<String> list = new List();
    for(var x in s){
      x.forEach((k,v)=>list.add(v));
    }
    return list;
 }

我想获取数据库中的所有值,但不知道如何将这些值转换为列表

4 个答案:

答案 0 :(得分:1)

您需要一个异步函数来检索数据。

void yourFunction() async {
     var x =  await DataBaseHelper.instance.queryAllRows();

}

答案 1 :(得分:0)

因为db.query是异步的,所以它们将返回Future<List<Map<String,dynamic>>。为了获得他们的结果而没有未来,我们可以回电,它将返回一个List<Map<String,dynamic>>

var x =  DataBaseHelper.instance.queryAllRows();

  Future<List<String>> queryAllRows() async {
    Database db = await instance._initDatabase();
    db.query(table ,columns: [columnname]).then((data){
      List<Map<String,dynamic>> s = data;
      List<String> list = new List();
      for(var x in s){
        x.forEach((k,v)=>list.add(v));
      }
    });
    return list;
  }

答案 2 :(得分:0)

您有两个选择。您可以使用将来的构建器来创建小部件,也可以使用简单的将来+ setState

Navigator.class Documentation

https://api.flutter.dev/flutter/widgets/FutureBuilder-class.html

https://dart.dev/tutorials/language/futures

List<String> _databaseList

queryAllRows().then((rows) {

   setState(() {_databaseList = rows});
})

setState将告诉该寡妇重建小部件树。 then处理未来。

答案 3 :(得分:0)

您需要等待queryAllRows()完成。如果您处于可以标记为异步的函数环境中,则只需使用关键字:

Widget test(BuildContext context) {
  return FutureBuilder<List<String>>(
    future: DataBaseHelper.instance.queryAllRows(),
    builder: (context, snap) {
      if (snap.hasData && !snap.hasError) {
        return ListView(
          padding: const EdgeInsets.all(8.0),
          children: <Widget>[...snap.data],
        );
      }
      else {
        return Container();
      }
    },
  );
}

相反,如果要渲染列表,则可以使用FutureBuilder并根据Future状态管理渲染小部件:

main.tf