我正在尝试了解该行中的代码
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']);
}
答案 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