我想对Dart中的匿名函数进行解释,以及如何将其作为参数传递给其他函数。
下面的例子来自flutter.dev的Write your first app。
Widget _buildSuggestions() {
return ListView.builder(
padding: const EdgeInsets.all(16.0),
itemBuilder: (context, i) {
if (i.isOdd) return Divider();
final index = i ~/ 2;
if (index >= _suggestions.length) {
_suggestions.addAll(generateWordPairs().take(10));
}
return _buildRow(_suggestions[index]);
});
}
这里的匿名函数是itemBuilder
。它的类型是{(BuildContext, int) → Widget itemBuilder}
。
如果它的类型是{() → Widget itemBuilder}
我可以理解,在运行时,函数的主体将被执行。但现在有了这些论据,我不知道如何将BuildContext
和int
提供给函数。
在ListView
的构造函数中,您传递的是一个函数,列表视图将保留该函数,可能是一个名为builderFunc
的实例变量。在将来的某个时刻,列表视图将被告知要构建,它将需要构建其子项。通过这样调用builderFunc
来做到这一点:
Widget jthChild = builderFunc(ctx, j);
其中ctx
和j
是调用者范围内的局部变量(ListView
中的方法)。 builderFunc
(您的匿名函数)将使用列表视图传递给它的构建上下文构造并返回j
th小部件。列表视图将使用不同的j
值多次调用您的函数。