You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Flutter中如何将Future<List<Map<String, Object?>>>转为Future<int>?

问题描述

我有一段使用SQFLite的Flutter代码:

Future<List<Map<String, Object?>>> countRecords() async {
    final db = await instance.dataBase;
    final result = await db.rawQuery('SELECT COUNT(${Fields.Txt}) FROM $Table');
    if(result.isNotEmpty) return result; else throw Exception('Empty Result');
}

另外一段运行失败的代码,错误原因是无法将Future<List<Map<String, Object?>>>赋值给Future<int>:

int Count = 0;

Future<int> countTableRecords() async {
    return Count = await DBHelper.instance.countRecords();
}

我需要从SQFLite数据库中提取记录数量,当前查询返回的是Future<List<Map<String, Object?>>>类型,但我需要返回Future<int>,该怎么实现类型转换?

解决方案

SQFLite的rawQuery返回的是包含查询结果的列表,每个元素是键值对Map。对于COUNT()查询,结果列表里只会有一个Map,这个Map里的唯一值就是记录总数。可以通过以下两种方式实现类型转换:

方法1:直接修改countRecords方法返回int

把原方法改成直接返回int类型,后续调用更简洁:

Future<int> countRecords() async {
    final db = await instance.dataBase;
    final result = await db.rawQuery('SELECT COUNT(${Fields.Txt}) FROM $Table');
    // 利用SQFLite工具方法提取第一个int值,为空则返回0兜底
    return Sqflite.firstIntValue(result) ?? 0;
}

这里的Sqflite.firstIntValue是SQFLite提供的工具方法,能自动从查询结果中提取第一个int值,避免手动解析的繁琐。

方法2:在countTableRecords中处理转换

如果不想修改原countRecords方法,可以在调用后手动解析结果:

int Count = 0;

Future<int> countTableRecords() async {
    final records = await DBHelper.instance.countRecords();
    // 从返回的列表中取出第一个Map,提取值并转为int
    Count = int.parse(records.first.values.first.toString());
    return Count;
}

由于原方法已经做了非空判断并抛出异常,直接使用records.first是安全的。

两种方法都能实现需求,推荐第一种,代码更简洁且更符合SQFLite的使用习惯。

内容的提问来源于stack exchange,提问作者DktPhl2018

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.08 17:27:05