【问题标题】:Convert the Future<List<String>> to List<String> when calls the Sqflite function调用 Sqflite 函数时将 Future<List<String>> 转换为 List<String>
【发布时间】:2019-11-20 10:55:37
【问题描述】:

我想从数据库中获取所有项目,但我不知道如何将 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;
 }

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

【问题讨论】:

  • 从你的List&lt;Map&lt;String,dynamic&gt;&gt;List&lt;String&gt; 与你可以做的所有地图中的所有值:var list = List&lt;String&gt;.from(s.expand((m) =&gt; m.values))
  • @NateBosch 我听从了您的建议,但收到错误“无法将参数类型 'Future>' 分配给参数类型 'Iterable'”。谢谢。
  • @Kamlesh 我的评论是关于处理类型 other 而不是异步位。有关处理Future 的信息,请参阅下面的答案。另见dart.dev/codelabs/async-await

标签: sqlite flutter dart


【解决方案1】:

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

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

}

【讨论】:

    【解决方案2】:

    你有两个选择。您可以使用 future builder 创建小部件或使用普通 futures + setState

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

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

    https://api.flutter.dev/flutter/widgets/State/setState.html

    List<String> _databaseList
    
    queryAllRows().then((rows) {
    
       setState(() {_databaseList = rows});
    })
    

    setState 将告诉颤振重建小部件树。 then 处理未来。

    【讨论】:

      【解决方案3】:

      因为 db.query 是异步的,所以它们将返回 Future&lt;List&lt;Map&lt;String,dynamic&gt;&gt;。为了在没有未来的情况下获得他们的结果,我们可以回电,它会返回一个List&lt;Map&lt;String,dynamic&gt;&gt;

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

      【讨论】:

      • 对不起,亲爱的,这个解决方案对我不起作用,导致我在调试控制台中出现错误“'Future>'的实例”。谢谢。
      【解决方案4】:

      您需要等待 queryAllRows() 完成。如果你在一个可以被标记为异步的函数的上下文中,只需要使用关键字:

      void someFunction() async {
      var x =  await DataBaseHelper.instance.queryAllRows(); // x is List<String>
      }
      

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

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

      【讨论】:

        猜你喜欢
        • 2015-08-15
        • 1970-01-01
        • 1970-01-01
        • 2021-09-17
        • 2021-01-13
        • 1970-01-01
        • 2021-02-28
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多