为啥我的 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>
的属性。我已经在TopicList
和Topic
上编写了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<dynamic>
而不是List<Topic>
。
现实比这更复杂,具有更高级别(属于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 构造函数返回的是动态对象而不是类型对象?的主要内容,如果未能解决你的问题,请参考以下文章
请问含有多个对象成员的派生类的构造函数执行时不是先执行基类么?为啥这个先输出的是“正式生是”这个