为啥我的 Dart 构造函数返回的是动态对象而不是类型对象?

Posted

技术标签:

【中文标题】为啥我的 Dart 构造函数返回的是动态对象而不是类型对象?【英文标题】:Why is my Dart constructor returning a dynamic rather than typed object?为什么我的 Dart 构造函数返回的是动态对象而不是类型对象? 【发布时间】:2019-08-28 16:31:57 【问题描述】:

我正在解析一些 JSON 以将存储的数据读入自定义对象。我已经简单地使用 dart:convert 中的 jsonDecode 实现了这一点,并在我的每个自定义对象上编写了 fromJson() 构造函数方法。它们是嵌套的——所以TopicList 对象具有List<Topic> 的属性。我已经在TopicListTopic 上编写了fromJson() 构造函数,并且我正在尝试使用map 获取解码的JSON 字符串并从中创建一个对象。但它失败了,因为 map 返回的列表类型错误,尽管它是从构造方法创建的。

class TopicList 
  List<Topic> topics;

  TopicList() 

  TopicList.fromJson(String jsonTopicList) 
    Map decoded = jsonDecode(jsonTopicList);

// this *doesn't* work
    topics = decoded['topics'].map((t) => Topic.fromJson(t)).toList();

// this does work
    topics = [];
    for (Map<String,dynamic> t in decoded['topics']) 
      Topic newT = Topic.fromJson(t);
      topics.add(newT);
    
  


class Topic 
  String topic;

  Topic(this.topic);

  Topic.fromJson(Map<String, dynamic> t) 
    this.topic = t['topic'];
  

当我尝试/捕获map 方法时,它告诉我map().toList() 调用返回的是List&lt;dynamic&gt; 而不是List&lt;Topic&gt;

现实比这更复杂,具有更高级别(属于Topic 的其他对象的另一个List)和其他属性。但这是正在发生的事情的核心。

我对解决方法不感兴趣 - 我有其中一种,它在上面的代码中工作。但我想了解为什么看似对象的构造函数(在本例中为 Topic.fromJson())返回的是动态对象而不是 Topic

【问题讨论】:

【参考方案1】:

.map()一个类型参数。

topics = decoded['topics'].map<Topic>((t) => Topic.fromJson(t)).toList();

【讨论】:

【参考方案2】:

改变

topics = decoded['topics'].map((t) => Topic.fromJson(t)).toList();

topics = decoded['topics'].map<Topic>((t) => Topic.fromJson(t)).toList();

这样,map 将返回 Topic 的迭代器,toList 将转换为列表。

【讨论】:

尝试了各种地方来放置该类型参数......除了那里!谢谢

以上是关于为啥我的 Dart 构造函数返回的是动态对象而不是类型对象?的主要内容,如果未能解决你的问题,请参考以下文章

为啥在我的代码中调用复制构造函数而不是移动构造函数?

请问含有多个对象成员的派生类的构造函数执行时不是先执行基类么?为啥这个先输出的是“正式生是”这个

为啥我应该在构造函数而不是 ngOnInit 中创建我的 Angular2 响应式表单?

面向对象编程

为啥通过构造函数返回对象时没有临时对象?

为啥 Eunit 坚持我的函数返回 ok, value 而不是?