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

将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)';
  }
}

关键修改点

  1. 先声明ArticleModel的所有成员变量
  2. 在构造函数参数中使用this.xxx语法,把传入的参数赋值给类的成员变量
  3. 可选:重写toString方法,确保日志能正确输出属性内容

修改完成后,通过fromJson实例化的ArticleModel对象就能正确持有从Map中读取的属性值了。


内容的提问来源于stack exchange,提问作者danial s

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.06 03:42:43