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

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());

代码昨日可正常运行,当前出现类型转换失败问题,以下是排查和修复方案:

相关代码

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业务上应为文本,通过以下方式修复:

  1. 检查DatabaseHelper的insert/update方法,确保插入title时传入String类型,避免误传int
  2. 修正数据库中已存在的int类型title数据,转为字符串
  3. 在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.10 17:17:27