Flutter类型转换异常:int无法转为String? 问题排查与修复请求
问题排查:类型不匹配异常(int 无法转为 String?)
错误信息
- 异常内容:
Unhandled Exception: type 'int' is not a subtype of type 'String?' - 报错位置:
- task_model.dart 第28行:
title = json['title']; - task_controller.dart 第19行:
taskList.assignAll(tasks!.map((data) => new Task.fromJson(data)).toList());
- task_model.dart 第28行:
代码昨日可正常运行,当前出现类型转换失败问题,以下是排查和修复方案:
相关代码
class Task { int? id; String? title; String? description; int? isCompleted; String? date; String? startTime; String? endTime; int? color; int? remind; String? repeat; Task({ this.id, this.title, this.description, this.isCompleted, this.date, this.startTime, this.endTime, this.color, this.remind, this.repeat, }); Task.fromJson(Map<String, dynamic> json) { id = json['id']; title = json['title']; description = json['description']; isCompleted = json['isCompleted']; date = json['date']; startTime = json['startTime']; endTime = json['endTime']; color = json['color']; remind = json['remind']; repeat = json['repeat']; } Map<String, dynamic> toJson() { final Map<String, dynamic> data = new Map<String, dynamic>(); data['id'] = this.id; data['title'] = this.title; data['date'] = this.date; data['description'] = this.description; data['isCompleted'] = this.isCompleted; data['startTime'] = this.startTime; data['endTime'] = this.endTime; data['color'] = this.color; data['remind'] = this.remind; data['repeat'] = this.repeat; return data; } } class TaskController extends GetxController { @override void onReady() { super.onReady(); } var taskList = <Task>[].obs; Future<int?> addTask({Task? task}) async { return await DatabaseHelper.insert(task!); } void getTasks() async { List<Map<String, dynamic>>? tasks = await DatabaseHelper.query(); taskList.assignAll(tasks!.map((data) => new Task.fromJson(data)).toList()); } void delete(Task task) { DatabaseHelper.delete(task); getTasks(); } void updateTask(int id) { DatabaseHelper.update(id); getTasks(); } }
问题原因
异常核心是类型不匹配:Task类中title字段定义为String?,但从数据库查询返回的json['title']是int类型,Dart的强类型检查不允许这种直接赋值。
可能触发原因:
- 数据库中
title字段的数据被意外修改为int类型(比如插入/更新时误传入数字) - 数据库表结构变更,
title字段类型从文本改为数值类型 - 之前的代码存在隐式转换逻辑,当前版本Dart类型检查更严格(概率较低,因昨日可正常运行)
修复方案
方案一:确保title转为字符串(推荐,符合文本类型预期)
如果title业务上应为文本,通过以下方式修复:
- 检查
DatabaseHelper的insert/update方法,确保插入title时传入String类型,避免误传int - 修正数据库中已存在的int类型
title数据,转为字符串 - 在
Task.fromJson中增加类型转换,确保即使返回int也能转为String:
修改title赋值代码为:
title = json['title']?.toString();
同时可给description也加上同样的处理,避免同类问题:
description = json['description']?.toString();
方案二:修改Task类的title字段类型(若title应为数值)
如果业务上title确实是数字,直接修改Task类的字段定义:
int? title;
同步确保toJson方法序列化逻辑正确,无需额外修改。
修改后的完整Task类(方案一)
class Task { int? id; String? title; String? description; int? isCompleted; String? date; String? startTime; String? endTime; int? color; int? remind; String? repeat; Task({ this.id, this.title, this.description, this.isCompleted, this.date, this.startTime, this.endTime, this.color, this.remind, this.repeat, }); Task.fromJson(Map<String, dynamic> json) { id = json['id']; title = json['title']?.toString(); description = json['description']?.toString(); isCompleted = json['isCompleted']; date = json['date']; startTime = json['startTime']; endTime = json['endTime']; color = json['color']; remind = json['remind']; repeat = json['repeat']; } Map<String, dynamic> toJson() { final Map<String, dynamic> data = new Map<String, dynamic>(); data['id'] = this.id; data['title'] = this.title; data['date'] = this.date; data['description'] = this.description; data['isCompleted'] = this.isCompleted; data['startTime'] = this.startTime; data['endTime'] = this.endTime; data['color'] = this.color; data['remind'] = this.remind; data['repeat'] = this.repeat; return data; } }
内容的提问来源于stack exchange,提问作者Pantzie Adrethien
相关产品推荐
相关产品推荐

