Flutter项目调用getItems()返回空值 数据库存储itemName为null问题排查
问题排查方向
1. 先检查nodo_item.dart的序列化/反序列化实现
- 存库时
toMap()方法是否正确映射私有字段:大部分同类问题都是误把_itemName写成itemName,导致SQL插入时对应字段没有拿到有效值,插入的就是null - 读库时
fromMap()方法是否正确给私有字段赋值:如果只写了itemName = map['itemName']没有赋值给_itemName私有属性,读取时自然拿不到值
错误实现参考:
// 错误的toMap实现 Map<String, dynamic> toMap() { return { 'itemName': itemName, // 这里如果getter逻辑异常、或者字段名拼写错误,就会传空 'dateCreated': dateCreated }; }正确实现要确保和数据库表字段完全对应,且取值直接取私有变量:
Map<String, dynamic> toMap() { return { 'itemName': _itemName, 'dateCreated': _dateCreated?.toIso8601String(), // 日期类型要转成可存储的字符串格式 }; } // 对应的fromMap实现 NodoItem.fromMap(Map<String, dynamic> map) : _itemName = map['itemName'], _dateCreated = DateTime.parse(map['dateCreated']);
2. 检查database_client.dart的saveItem()实现
- 插入操作的字段名是否和建表语句的字段完全一致,SQLite字段名大小写敏感
- 执行
insert时传入的conflictAlgorithm是否会导致旧数据被覆盖为空,或者事务没有提交成功 - 确认调用
saveItem()时传入的NodoItem实例的_itemName、_dateCreated本身已经被正确赋值,不是传入了空属性的实例
3. 检查database_client.dart的getItems()实现
- 查询语句是否正确select了
itemName和dateCreated字段,不要只select id或者其他字段 - 遍历查询结果生成
NodoItem实例时,是否正确调用了fromMap方法,有没有把查询结果的value完整传递进去
常见错误写法:
// 错误:只取了id生成实例,其他字段都留空 List<NodoItem> items = maps.map((item) => NodoItem(id: item['id'])).toList();正确写法要把所有查询字段都传入实例生成逻辑:
List<NodoItem> items = maps.map((item) => NodoItem.fromMap(item)).toList();
4. 快速定位调试手段
可以在两个核心方法里加打印,快速定位问题环节:
// saveItem里插入前加打印 var insertMap = item.toMap(); print('待插入的数据:$insertMap'); await db.insert('nodo_items', insertMap); // getItems里拿到查询结果后加打印 var queryResult = await db.query('nodo_items'); print('查询到的原始库数据:$queryResult');
如果打印的待插入数据里itemName已经是null,问题出在序列化或者入参赋值;如果待插入有值,查询原始数据是空,问题出在插入逻辑;如果原始查询有值,生成实例后是空,问题出在fromMap反序列化逻辑。
内容的提问来源于stack exchange,提问作者Saad Ebad
相关产品推荐
相关产品推荐

