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

Flutter保存数据后读取itemName返回null而非输入值如何解决

问题原因

核心问题90%以上出在实体类和数据库的映射逻辑不匹配,具体分为三类常见情况:

  • 数据库建表时遗漏columnItemName对应列,或者列名和定义的常量值不匹配
  • NoDoItem.toMap()序列化方法的键名和表列名不一致,导致数据根本没有写入对应列
  • NoDoItem.map()反序列化构造器的取值键名和数据库返回的键名不一致,即使数据写入成功也无法正确读取赋值给_itemName
  • 极小概率是NoDoItem普通构造函数参数赋值错误,传入的文本没有正确赋值给_itemName字段

修复步骤

第一步:定位问题环节

先在查询逻辑中打印原始数据库返回结果,快速确认是写入失败还是读取解析失败:

Future<List> getItems() async
{
    var dbClient = await database;
    var result = await dbClient.rawQuery("SELECT * FROM $tableName ORDER BY $columnItemName ASC");
    // 新增打印查看原始数据
    print("数据库原始查询结果:$result");
    return result.toList();
}

如果打印结果中已经没有用户输入的内容,说明是写入环节问题;如果有对应内容,说明是反序列化解析问题。

第二步:核对建表语句

确保建表时包含columnItemName对应的文本列,列名和你定义的常量值完全一致,示例:

// 建表执行逻辑示例,确保列名和全局定义的常量完全匹配
await db.execute('''
  CREATE TABLE $tableName (
    $columnId INTEGER PRIMARY KEY AUTOINCREMENT,
    $columnItemName TEXT NOT NULL,
    $columnDateCreated TEXT NOT NULL
  )
''');

注意:如果之前已经创建过表,修改列名/新增列后需要卸载重装APP,或者做数据库版本升级,否则表结构修改不生效。

第三步:修正toMap()序列化逻辑

确保toMap返回的键名和表列名完全一致,示例:

Map<String, dynamic> toMap() {
  return <String, dynamic>{
    columnId: _id,
    columnItemName: _itemName, // 键必须和列名常量一致,不能自定义其他名称
    columnDateCreated: _dateCreated,
  };
}

第四步:修正map构造器反序列化逻辑

确保从Map取值的键名和数据库返回的列名完全一致,示例:

NoDoItem.map(Map<String, dynamic> map) {
  _id = map[columnId] as int?;
  // 这里取值的键必须和列名完全一致,比如列名是下划线格式的item_name就不能写小驼峰itemName
  _itemName = map[columnItemName] as String?;
  _dateCreated = map[columnDateCreated] as String?;
}

额外检查项

确认NoDoItem普通构造函数的参数赋值逻辑正确,没有把传入的文本赋值到其他字段:

// 正确示例
NoDoItem(this._itemName, this._dateCreated);

内容的提问来源于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:48:02