将Map转为ArticleModel时对象属性全部为null的问题求助
问题:将Map转为ArticleModel后对象属性全部为null?
问题背景
通过Dio获取到的接口数据能正常读取字段,但转成ArticleModel实例后所有属性都为null,相关代码及排查日志如下:
数据转换代码
List<ArticleModel> value = _result.data!['articles'] .map<ArticleModel>( (dynamic i) => ArticleModel.fromJson(i as Map<String, dynamic>)) .toList();
ArticleModel类代码
class ArticleModel extends ArticleEntity { const ArticleModel({ int? id, String? author, String? title, String? description, String? url, String? urlToImage, String? publishedAt, String? content, }); factory ArticleModel.fromJson(Map<String, dynamic> map) { return ArticleModel( author: map['author'] ?? '', title: map['title'] ?? '', description: map['description'] ?? '', url: map['url'] ?? '', urlToImage: map['urlToImage'] ?? '', publishedAt: map['publishedAt'] ?? '', content: map['content'] ?? '', ); } }
排查日志
// 能正常输出正确的title字符串 log(_result.data!['articles'][0]['title'], name: 'title'); List<ArticleModel> value = _result.data!['articles'] .map<ArticleModel>( (dynamic i) => ArticleModel.fromJson(i as Map<String, dynamic>)) .toList(); // 输出结果为ArticleModel(null, null, ...) log(value[0].toString(), name: 'articleModel');
解决方案
问题出在ArticleModel的构造函数上:你只在构造函数的参数列表里定义了属性,但没有将参数赋值给类的成员变量,导致实例化后所有属性都是默认的null值。
修改后的ArticleModel代码如下:
class ArticleModel extends ArticleEntity { // 显式声明类的成员变量 final int? id; final String? author; final String? title; final String? description; final String? url; final String? urlToImage; final String? publishedAt; final String? content; // 构造函数中用this.xxx将参数绑定到成员变量 const ArticleModel({ this.id, this.author, this.title, this.description, this.url, this.urlToImage, this.publishedAt, this.content, }); factory ArticleModel.fromJson(Map<String, dynamic> map) { return ArticleModel( author: map['author'] ?? '', title: map['title'] ?? '', description: map['description'] ?? '', url: map['url'] ?? '', urlToImage: map['urlToImage'] ?? '', publishedAt: map['publishedAt'] ?? '', content: map['content'] ?? '', ); } // 重写toString方法,方便日志查看属性值(可选) @override String toString() { return 'ArticleModel(id: $id, author: $author, title: $title, description: $description, url: $url, urlToImage: $urlToImage, publishedAt: $publishedAt, content: $content)'; } }
关键修改点
- 先声明
ArticleModel的所有成员变量 - 在构造函数参数中使用
this.xxx语法,把传入的参数赋值给类的成员变量 - 可选:重写
toString方法,确保日志能正确输出属性内容
修改完成后,通过fromJson实例化的ArticleModel对象就能正确持有从Map中读取的属性值了。
内容的提问来源于stack exchange,提问作者danial s
相关产品推荐
相关产品推荐

