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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.01 00:30:00