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

