【问题标题】: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

【问题讨论】:

    标签: flutter dart


    【解决方案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 将转换为列表。

      【讨论】:

      • 尝试了各种地方来放置该类型参数......除了那里!谢谢
      猜你喜欢
      • 2014-05-04
      • 2022-01-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多