You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.10 21:50:22