首页 > 解决方案 > 看不懂这个 Flutter 闭包函数代码?

问题描述

var callbacks = [];
for (var i = 0; i < 2; i++) {
  callbacks.add(() => print(i));
}
callbacks.forEach((c) => c());

我不明白两件事:

  1. print(i) 是返回类型 Void,编译器不应该显示“错误”,因为 print(i) 的工作是将项目打印到控制台而不返回任何内容。

  2. 在“ callbacks.forEach((c) => c()); ”行中,c() 是如何成为一个函数的,因为它是 lambda 函数内部用于获取值的参数。

代码链接: https ://dart.dev/guides/language/language-tour#type-test-operators 下 for Loops

PS:我是这种语法的初学者,非常感谢您的帮助!

标签: flutterloopsdart

解决方案


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()


推荐阅读