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

