Flutter SQFlite问题:无法将Future<int>赋值给int类型变量
解决SQFlite获取记录数并赋值给int变量的问题
核心问题分析
你遇到的错误是因为异步方法返回的是Future<int>类型,不能直接赋值给同步的int变量,同时你的countRecords方法存在逻辑冗余,countDBRecords还有递归调用的错误。
步骤1:修正记录数查询方法
原countRecords把COUNT查询结果转成Record列表完全多余——COUNT查询返回的是单行单列的数值结果,直接提取即可:
Future<int> countRecords() async { final db = await instance.dataBase; // 执行COUNT统计查询 final result = await db.rawQuery('SELECT COUNT(${Fields.id}) FROM $Table'); // 提取统计数值,为空时默认返回0 return Sqflite.firstIntValue(result) ?? 0; }
步骤2:正确调用异步方法完成赋值
异步方法必须用await获取实际返回值,且await只能在标记为async的函数中使用,因此需要把你的countRecordsTotal改成异步方法:
int myCount = 0; // 异步获取记录数并赋值 Future<int> countRecordsTotal() async { // 用await等待异步方法执行完成,拿到实际int值后赋值 myCount = await DB.instance.countRecords(); return myCount; }
步骤3:在异步场景中使用该数值
如果需要在UI中展示这个数值(比如Flutter组件),可以在initState中调用并更新UI:
@override void initState() { super.initState(); _loadRecordCount(); } void _loadRecordCount() async { await countRecordsTotal(); setState(() {}); // 更新UI以显示最新的myCount }
额外注意点
- 禁止在同步方法中直接调用异步方法赋值,异步操作必须等待完成才能拿到结果,
await就是用来等待这个过程的。 - 原
countDBRecords存在递归调用自身的错误,直接调用修正后的countRecords即可,无需额外封装。
内容的提问来源于stack exchange,提问作者DktPhl2018
相关产品推荐
相关产品推荐

