Flutter sqflite报错:方法未在Future类型上定义
出错原因
两个核心问题导致报错:
- 你定义的
database是异步getter,返回值类型为Future<Database?>,直接执行var _data = DatabaseService.instance.database时没有加await关键字,_data拿到的是Future异步占位对象,不是实际的sqflite数据库实例。Future类本身没有定义insertContacts、getcontacts方法,因此编译器直接抛出方法不存在的错误:
The method 'insertContacts' isn't defined for the type 'Future'. Try correcting the name to the name of an existing method, or defining a method named 'insertContacts'.
- 你的
insertContacts、getcontacts方法是定义在DatabaseService单例类中的封装方法,并不是sqflite原生Database类的成员方法,就算你加await拿到了Database实例,也无法直接通过Database实例调用这两个方法。
除此之外代码里还有一个运行时bug:insertContacts方法中调用db.insert时第一个参数传入了数据库文件名dbName,但sqflite的insert方法第一个参数需要传入表名,和你建表时的contacts对应,直接传文件名会运行时报“表不存在”错误。
修复方案
按以下步骤修改即可:
- 修正
database_services.dart中的插入逻辑,将insert方法的第一个参数从数据库文件名改为表名,同时给方法加上明确的返回类型避免类型异常:
// 修改后的insertContacts方法 Future<void> insertContacts(ContactModel modelObj) async { final db = await instance.database; await db?.insert( 'contacts', // 替换原来的dbName,这里填建表时的表名 modelObj.toMap(), conflictAlgorithm: ConflictAlgorithm.replace, ); }
- 修改业务页面
Plugin1.dart的代码:- 删掉原来错误的
var _data = DatabaseService.instance.database;声明,你封装的数据库操作方法内部已经自动处理了数据库实例获取逻辑,不需要业务层手动持有Database对象。 - 修正查询联系人的
printDB方法,直接通过DatabaseService单例调用封装的查询方法:
Future<void> printDB() async { print('printing DB'); final contactList = await DatabaseService.instance.getcontacts(); if(contactList != null) { print(contactList); } else{ print('no contacts stored'); } }- 修正选择联系人后的插入逻辑,加await等待插入执行完成:
// 原来的_data.insertContacts(model); 替换为下面这行 await DatabaseService.instance.insertContacts(model); - 删掉原来错误的
- (可选优化)删掉Plugin1.dart中重复导入的
contact_model.dart语句,保持代码整洁。
验证逻辑
修改后所有数据库操作都通过DatabaseService单例统一调用,异步方法都正确加了await等待结果,不会再出现Future类型上找不到方法的编译错误,插入和查询逻辑也能正常执行。
内容的提问来源于stack exchange,提问作者sjDev
相关产品推荐
相关产品推荐

