flutter - 看不懂这个 Flutter 闭包函数代码?
问题描述
var callbacks = [];
for (var i = 0; i < 2; i++) {
callbacks.add(() => print(i));
}
callbacks.forEach((c) => c());
我不明白两件事:
print(i) 是返回类型 Void,编译器不应该显示“错误”,因为 print(i) 的工作是将项目打印到控制台而不返回任何内容。
在“ callbacks.forEach((c) => c()); ”行中,c() 是如何成为一个函数的,因为它是 lambda 函数内部用于获取值的参数。
代码链接: https ://dart.dev/guides/language/language-tour#type-test-operators 下 for Loops
PS:我是这种语法的初学者,非常感谢您的帮助!
解决方案
var callbacks = [];
for (var i = 0; i < 2; i++) {
callbacks.add(() => print(i));
}
callbacks.forEach((c) => c());
这里,() => print(i)
是一个不带参数并返回的闭包void
。在循环中,您将这些函数添加到callback
列表中。
(c) => c()
is a closure which takes a dynamic
parameter and attempts to call it (i.e. calls c.call()
).
Some type safety might be helpful here, for example:
final callbacks = <void Function()>[]; // an empty list of functions that look like () -> void
for (var i = 0; i < 2; i++) {
final void Function() callback = () => print(i);
callbacks.add(callback);
}
callbacks.forEach((void Function() callback) => callback());
In this example, because callbacks
has a type of List<void Function()>
, the parameter of the function passed to forEach
is a void Function()
, which means you can call it with c()
推荐阅读
- botframework - 在没有互联网连接的情况下使用远程托管的 botframework 模拟器或机器人
- rust - 宏中的变量仍在此深度错误处重复
- php - 如何从laravel子文件夹中的url中删除public
- git - 如何在 Git Hub 中查找所有非活动一个月或更长时间的用户
- angular - npm:试图重新安装无 admob 插件,但它抛出一个关于不包含 package.json 文件的错误
- swift - 如何快速比较两种不同的日期格式
- c++ - 需要限制“检测特征()”的角度上限,而不仅仅是下限。应该很容易?
- java-8 - Java8 - 独立代码的异步执行
- macos - 列出 macOS 上所有已加载/已卸载或同时启动的代理
- javascript - 我有一个对象数组,每个对象内部都有一个称为分数的键,我需要找到每个分数的总和并将其推送到一个数组中