使用fromMap解析JSON响应为Dart实体时全部字段为空,求排查
问题诊断与修复方案
首先一眼就看到了核心问题:你的Test类定义里出现了类名和构造函数名不匹配的笔误,这直接导致了字段全为null的情况。
具体问题分析
你定义的类名是Test,但构造函数(包括默认构造函数和fromMap命名构造函数)却写成了Feature:
class Test{ final String id; final String name; const Feature({ this.id, this.name, }); // 这里构造函数名是Feature,不是Test! Feature.fromMap(Map<String, dynamic> map) : id= map['id'], name= map['name']; }
这相当于你给一个不存在的Feature类写了构造函数,而Test类本身只有Dart自动生成的无参构造函数。当你调用Test.fromMap(data['doc'])时,这个构造函数根本不属于Test类——如果是新版本Dart,这应该直接编译报错,但你说没有错误信息,大概率是代码复制时的混淆,或者你实际运行的代码里类名和构造函数名搞反了。
修复步骤
把构造函数的名字改成和类名一致的Test:
class Test{ final String id; final String name; // 默认构造函数 const Test({ this.id, this.name, }); // 命名构造函数fromMap Test.fromMap(Map<String, dynamic> map) : id = map['id'], name = map['name']; }
额外注意事项
- JSON格式问题:你提供的JSON里有多余的尾逗号(比如
"name":"Test Document",和"name":"X2"后面的逗号),严格来说这是无效JSON,虽然部分解析器能容忍,但建议后端修复,或者确保你的解析逻辑支持宽松模式。 - 空安全适配(Dart 2.12+):如果你的项目启用了空安全,
final String id这类非空字段必须被初始化,要么给字段加上可空标记String?,要么在构造函数里给参数加required:// 允许字段为空的版本 class Test{ final String? id; final String? name; const Test({ this.id, this.name, }); Test.fromMap(Map<String, dynamic> map) : id = map['id'], name = map['name']; } // 字段必须非空的版本 class Test{ final String id; final String name; const Test({ required this.id, required this.name, }); Test.fromMap(Map<String, dynamic> map) : id = map['id'] as String, name = map['name'] as String; } - 验证数据存在性:在返回前可以加一句
print(data['doc']),确认这个Map里确实包含id和name字段,避免JSON结构和你预期的不一致。
内容的提问来源于stack exchange,提问作者QuiteListener
相关产品推荐
相关产品推荐

