You need to enable JavaScript to run this app. Flutter使用sqflite时insert返回Future<int>实例而非实际记录ID
优惠活动
大模型
产品
解决方案
定价
更多

Flutter使用sqflite时insert返回Future<int>实例而非实际记录ID

问题核心原因

代码运行后打印出Instance of 'Future<int>',拿不到实际的插入记录ID,本质是调用异步方法时漏写了await关键字。
你封装的insert_into_Account本身是带async标记、返回Future<int>的异步方法,在testDb里调用这个方法时,没有用await等待异步执行完成,直接把未完成的Future对象本身赋值给了id变量,自然打印时只会输出Future的实例描述,拿不到它内部存储的、数据库生成的自增主键值。
这也完全符合Dart的异步执行逻辑:sqflite的所有数据库操作都是异步调度的,返回的Future会在插入流程完整结束、拿到生成的主键后才会完成解析,不主动await等待这个过程,拿到的只是异步任务的句柄,根本访问不到内部的实际数值。

具体修复方案

只需要在调用insert_into_Account的位置补上await,等待插入流程执行完成即可,修正后的testDb方法代码如下:

Future testDb() async {
    db = await openDb();
    // 补充await等待插入完成,拿到解析后的实际int类型主键值
    var id = await insert_into_Account(Account(
      name: 'maliha',
      adress: 'eeee',
      balance: 123,
      issueDate: '333',
      telphone: 'ddd',
      type: 'eee',
    ));
    List lists = await db.rawQuery('select * from account');
    print(lists[0].toString());
    // 此时打印的id值会和查询结果里的accountNumber数值(也就是你之前输出的5)完全一致
    print(id.toString());
}
日常注意事项
  • 所有调用你封装的insert_into_Account方法的代码块,只要处于async上下文中,都必须搭配await使用,否则都会出现拿到Future实例、拿不到实际返回值的问题
  • 补全await后,代码执行顺序会严格匹配逻辑预期:先完成数据库连接打开→完成插入并拿到生成的主键→再执行全表查询,不会出现异步时序混乱导致的步骤错位
  • 不要在没有await的同步代码块里试图直接读取Future的内部值,Dart的单线程事件循环机制决定了未await的异步操作是被排入事件队列、延迟到后续轮次执行的,当前同步代码运行到print语句时,插入操作大概率还没跑完,自然也拿不到正确的ID

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.22 23:15:04