Flutter SQflite:如何解决_InternalLinkedHashMap类型不匹配未处理异常?
解决sqflite中_InternalLinkedHashMap与Map<String, dynamic>类型不匹配的错误
你遇到的这个类型不匹配问题在sqflite开发里挺常见的,本质是sqflite查询返回的结果是_InternalLinkedHashMap类型,但你的代码里期望的是标准的Map<String, dynamic>,导致强类型检查失败。我来帮你一步步排查和解决:
问题根源
sqflite从数据库读取数据时,返回的是dart:collection包中的_InternalLinkedHashMap实例,虽然它实现了Map接口,但Dart的类型系统是严格的——直接把它赋值给Map<String, dynamic>类型的变量,会触发类型转换错误,因为二者并非直接的子父类关系。
具体解决方案
1. 显式转换Map类型
在将数据库返回的map转换为Rezepte实体对象时,先通过Map<String, dynamic>.from()方法把_InternalLinkedHashMap转换成标准的Map<String, dynamic>。
假设你原本有一个从map转实体的方法:
Rezepte fromMap(Map<String, dynamic> map) { Rezepte rezepte = Rezepte(); rezepte.id = map['id']; rezepte.name = map['name']; rezepte.personen = map['personen']; rezepte.beschr = map['beschr']; return rezepte; }
调用时不要直接传数据库返回的map,而是先做转换:
// 从数据库获取到的原始map对象 var dbMap = await db.query('Rezepte', where: 'id = ?', whereArgs: [1]).first; // 显式转换后再传入 Rezepte rezepte = fromMap(Map<String, dynamic>.from(dbMap));
2. 批量查询的处理
如果是批量查询返回的List<Map>,也要逐个转换:
List<Rezepte> fetchAllRezepte() async { List<Map> rawMaps = await db.query('Rezepte'); List<Rezepte> rezepteList = []; for (var rawMap in rawMaps) { // 每个map都先转换类型 rezepteList.add(fromMap(Map<String, dynamic>.from(rawMap))); } return rezepteList; }
3. 优化实体类的构造逻辑
可以给Rezepte类添加一个工厂构造函数,把类型转换和实体初始化整合在一起,让代码更简洁:
class Rezepte { int id; String name; int personen; String beschr; // 默认构造函数 Rezepte(); // 工厂构造函数,直接处理类型转换 factory Rezepte.fromMap(dynamic map) { // 先把传入的map转换成标准Map<String, dynamic> final standardMap = Map<String, dynamic>.from(map); return Rezepte() ..id = standardMap['id'] ..name = standardMap['name'] ..personen = standardMap['personen'] ..beschr = standardMap['beschr']; } }
调用时直接传入数据库返回的map即可,内部已经处理了类型转换:
Rezepte rezepte = Rezepte.fromMap(dbMap);
注意事项
- 不要忽略Dart的强类型检查,第三方库返回的类型可能和你预期的不一致,一定要显式处理转换。
- 如果后续使用json_serializable等序列化工具,也要确保先把数据库返回的map转换成标准
Map<String, dynamic>,再进行序列化操作。
内容的提问来源于stack exchange,提问作者user9047282
相关产品推荐
相关产品推荐

