尝试了解Dart中的匿名函数

时间:2019-09-17 08:41:06

标签: flutter 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']);
}

1 个答案:

答案 0 :(得分:1)

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

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

  

返回一个新的惰性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方法基本上是在列表people中进行迭代,并根据您在return语句中编写的内容返回一个新的Iterable

因此,print(mappedNames)将为您提供以下内容:

(Mr. Joe Smithers, Mr. Patrick Thomas)

Note:您不必添加类型,因为dart会推断出类型。


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

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

(json.decode(response.body) as List),这意味着您正在转换json对象以键入List,然后使用map在其内部进行迭代并返回一个可迭代的对象。

然后,您使用toList()从返回的List中创建一个iterable