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

Flutter项目运行报LateInitializationError:_id未初始化如何解决

问题原因

报错触发的核心原因是新增待办项时,你使用的NoDoItem(String _itemName, String _dateCreated)构造函数没有对late修饰的_id字段赋值,但调用toMap()方法序列化数据存入数据库时,直接访问了未初始化的_id字段,触发了Late初始化异常。

同时还存在列名不统一的隐性问题:数据库建表时定义的字段名是itemName、dateCreated,但NoDoItem的序列化/反序列化方法里用的是首字母大写的ItemName、DateCreated,后续读取数据时会出现字段空值问题。

修复步骤

1. 修改nodo_item.dart字段定义

将late int _id改为可空类型int? _id,去掉late修饰(新增数据时id由数据库自增生成,本身不需要提前赋值),同时将id设为构造函数的可选参数:

class NoDoItem extends StatelessWidget {
  final String _itemName;
  final String _dateCreated;
  final int? _id;

  NoDoItem(this._itemName , this._dateCreated, {int? id, Key? key}) : _id = id, super(key: key);

2. 修正toMap方法逻辑

恢复id非空才写入map的逻辑,避免新增数据时把空id传入数据库,同时统一列名和数据库定义一致:

Map<String , dynamic>toMap()
{
  var map = <String , dynamic>{};
  map['itemName'] = _itemName;
  map['dateCreated'] = _dateCreated;
  if(_id !=null)
  {
    map['id'] = _id;
  }
  return map;
}

3. 修正反序列化方法的字段名

把NoDoItem.map和NoDoItem.fromMap里的字段名改成和数据库一致的小写开头,避免后续读取数据出错:

NoDoItem.map(dynamic obj, {Key? key}) : super(key: key)
{
  _itemName = obj['itemName'];
  _dateCreated = obj['dateCreated'];
  _id = obj['id'];
}

NoDoItem.fromMap(Map<String , dynamic>map, {Key? key}) : super(key: key)
{
  _itemName = map['itemName'];
  _dateCreated = map['dateCreated'];
  _id = map['id'];
}

4. 可选优化:DatabaseHelper的database getter优化

放开注释的判空逻辑,避免每次调用数据库都重复初始化:

Future<Database> get database async
{
  if(_db!=null)
  {
    return _db;
  }
  _db =await initDb();
  return _db;
}

修改完成后重新运行项目即可正常插入数据,不会再触发_id未初始化的报错。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 17:09:01