首页 > 解决方案 > 试图理解 Dart 中的匿名函数

问题描述

我正在尝试理解该行中存在的代码

list = (json.decode(response.body) as List)
          .map((data) => PhotoData.fromJson(data))
          .toList();

我有以下问题 a) .map 有什么作用?b) 上述代码中的“数据”是什么 c) 请您将代码简化为长格式,以便我更好地掌握它。

完整的功能如下:

_fetchData() async {

  http.Response response =
      await http.get("https://jsonplaceholder.typicode.com/photos");
  print("Fetching data...");
  list = (json.decode(response.body) as List)
      .map((data) => PhotoData.fromJson(data))
      .toList();
  setState(() {
    isLoading =false;
  });
}




factory PhotoData.fromJson(Map<String, dynamic> json) {
  return PhotoData( json['id'], json['title'],
      json['thumbnailUrl'], json['url']);
}

标签: flutterdart

解决方案


map是类内部的方法Iterable。由于类List实现EfficientLengthIterable<E>因此它继承方法map

根据文档,地图执行以下操作:

返回一个新的惰性 Iterable,其中包含通过按迭代顺序在此 Iterable 的每个元素上调用 f 创建的元素。


这是该map方法的实现:

Iterable<T> map<T>(T f(E e)) => MappedIterable<E, T>(this, f);

Iterable<T>=> 这意味着该map方法将返回一个 Iterable

f(E e)=> 表示map将包含一个具有元素类型的函数E

=>箭头是写return的简写


例子:

class Person 
{
  String firstName;
  String lastName;

  Person(this.firstName, this.lastName);
}

void main() {
    List<Person> people = new List<Person>();
  people.add(new Person("Joe", "Smithers"));
  people.add(new Person("Patrick", "Thomas"));
  var mappedNames = people.map<String>((Person n) => 'Mr. ${n.firstName} ${n.lastName}');
  print(mappedNames);
}

在这个例子map中返回一个类型的迭代String,因此您可以添加map<String>,并且变量n是类型Person,因此您可以编写Person n

的类型n等价于变量的类型people。因为这里基本上map方法是在列表中迭代并根据您在 return 语句中编写的内容people返回一个新的。Iterable

因此print(mappedNames)会给你以下内容:

(Mr. Joe Smithers, Mr. Patrick Thomas)

注意:您不必添加类型,因为 dart 推断类型。


在您的代码中,您具有以下内容:

list = (json.decode(response.body) as List)
          .map((data) => PhotoData.fromJson(data))
          .toList();

(json.decode(response.body) as List)这意味着您将 json 对象转换为 type List,然后使用map您在其中进行迭代并返回一个可迭代对象。

然后你使用从返回toList()的创建一个Listiterable


推荐阅读