Flutter读取本地数据库触发未处理异常:int无法转为double
排查思路与解决方案
1. 先查Operation.fromMap的类型转换逻辑
直接定位你Operation.fromMap方法里的字段映射代码,重点关注double类型字段的转换方式:
- 如果是用
map['xxx'] as double强转,而数据库中该字段实际存储的是int值,必然触发类型不匹配异常。比如你定义了double amount,但数据库里存的是整数,强转就会失败。 - 改成兼容int和double的安全转换:
class Operation { final double amount; Operation({required this.amount}); factory Operation.fromMap(Map<String, dynamic> map) { return Operation( // 用num统一接收后转double,兼容int/double类型的数据库值 amount: (map['amount'] as num).toDouble(), ); } }
2. 核对数据库表的字段定义
检查创建表的SQL语句,确认对应字段的类型:
- 如果
Operation里是double字段,但表字段定义为INTEGER,插入int值后读取时会拿到int类型,强转double必然报错; - 如果表字段是
REAL(对应Flutter的double),但部分SQLite版本会保留插入的int类型,读取时仍需做类型兼容。
3. 排查插入数据的代码
查看你插入Operation到数据库的逻辑:
- 有没有把int类型值直接赋值给
Operation的double字段?比如Operation(amount: 100)(100是int),插入后数据库可能存为int,读取时触发类型问题。 - 插入时提前转成double:
Operation(amount: 100.0),或者在toMap方法里统一处理:Map<String, dynamic> toMap() { return { 'amount': amount.toDouble(), }; }
4. 加日志定位问题根源
在LocalDatabase.getOperationList方法里,读取到map后先打印字段的实际类型,明确是存储还是读取环节出错:
// 遍历查询结果时加日志 for (var map in maps) { print('amount字段类型: ${map['amount'].runtimeType}, 值: ${map['amount']}'); // 再调用Operation.fromMap }
如果打印结果是int,说明存储时存的是int,问题出在存储环节或fromMap的转换逻辑;如果是double,那大概率是fromMap里的转换代码写错了。
内容的提问来源于stack exchange,提问作者Robson Fischer
相关产品推荐
相关产品推荐

