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']);
}
解决方案
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()
的创建一个List
iterable
推荐阅读
- java - minimax tic-tac-toe 算法总是错误地将“X”或“O”放在下一个可用位置
- php - 如果列被另一个表引用,防止行删除 PHP | 拉拉维尔 | mysql
- c# - 如何读取 8 位图像文件?
- c# - 使用 C# RSACryptoServiceProvider 类生成 SSH Putty 私有对
- c++ - cin 如何区分空格和换行符?
- c# - 使用 ECC 加密证书签署令牌
- java - Log4j2 异步记录器默认缓冲区大小
- bash - bash脚本中没有这样的文件错误来列出文件
- ruby-on-rails - 如何使用 Active Record 查询您在 Rails 中查找的另一条记录的相邻先前记录?
- python - TypeError:字符串对象不可调用