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
相关产品推荐
相关产品推荐

