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
相关产品推荐
相关产品推荐

