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

Flutter报错:type 'int' is not subtype of type 'String' 问题排查

问题分析与解决

这个问题我做Flutter SQLite开发时也踩过同款坑,本质就是强类型语言的类型不匹配在作祟,咱们一步步拆解清楚:

错误原因

  • 你的DataEquipmentReg模型里,description被明确定义为String类型,但SQLite是弱类型数据库——哪怕建表时写了description STRING,它依然允许存入整数、布尔值等任意类型。当你把整数1存入这个字段时,数据库里实际存储的就是int类型的值。
  • 错误发生在从数据库映射到模型对象的阶段:当你把查询结果转换成DataEquipmentReg实例时,直接把数据库返回的int值赋值给了String类型的description字段,Flutter的强类型检查立刻就会抛出type 'int' is not subtype of type 'String'错误。这里要注意,你代码里的.toString()是在对象创建之后的拼接环节,根本没机会执行到。

彻底解决方法

要从根源解决问题,需要在数据库读写的边界处做好类型控制,分三步来:

1. 修复数据读取的类型转换

在把数据库查询结果转换成DataEquipmentReg模型的代码中(你没贴这部分,但肯定有类似逻辑),强制将description转成String类型,不管数据库里存的是什么类型。比如:

// 示例:从Map创建模型的构造函数
DataEquipmentReg.fromMap(Map<String, dynamic> map)
    : eq_no = map['eq_no'].toString(),
      description = map['description'].toString(); // 显式转换,确保是String

这样不管数据库里存的是int、double还是其他类型,都会被统一转成String,完美匹配模型的类型定义。

2. 规范数据写入的类型

从源头避免存入非String类型的description,在插入或更新数据时,先把要存储的值转成String:

// 插入数据示例
await db.insert(
  'EquipmentRegTable',
  {
    'eq_no': equipmentEqNo,
    'description': equipmentDescription.toString(), // 统一转成String再存入
  },
);

// 更新数据示例
await db.update(
  'EquipmentRegTable',
  {'description': newDescription.toString()},
  where: 'eq_no = ?',
  whereArgs: [targetEqNo],
);

3. 修复现有数据库中的存量数据

如果你的数据库里已经有一些int类型的description数据,可以执行一条SQL把它们批量转成String:

UPDATE EquipmentRegTable SET description = description || '';

这条SQL通过拼接空字符串的方式,把所有非String类型的description值转换成String,后续读取就不会再出问题了。


内容的提问来源于stack exchange,提问作者user9139407

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.13 08:01:17