首页 > 解决方案 > Dart:嵌套函数中的变量如何绑定到父级的局部变量?

问题描述

我在循环中创建元素,并且每个元素都需要不同的回调值。这段代码做到了:

for (var obj in objects) {
  result.add(
    content: GestureDetector(
      child: Text(obj.title),
      onTap: () => widget.onTap(obj), // Correct object is bound on each loop iteration.
    ),
  );
}

然而,这有不同的工作方式:

var obj;
for (var i = 0; i < objects.length; i++) {
  obj = objects[i];
  result.add(
    content: GestureDetector(
      child: Text(obj.title),
      onTap: () => widget.onTap(obj), // Always get the last object in array.
    ),
  );
}

后者实际上是预期的,而前者让我想知道为什么它首先会起作用。看起来像var在每次迭代中创建一个新变量,并保留在绑定中。我的问题是:

  1. 这种绑定的确切机制是什么?究竟是什么创造了一个新的范围?是否记录在案?
  2. var循环会影响性能和内存吗?如果我不需要绑定,var i; for (i = ...总比for (var i = ...因为它不会var在每次迭代时创建 s 更好吗?

标签: flutterdartlambdascope

解决方案


#1 ...绑定通常被称为“闭包绑定”,因为超出闭包范围但仍在闭包中的代码范围内的变量实际上是绑定的一部分。

至于您的 #2 问题,如果没有人在闭包中捕获值,则所有迭代都使用相同的变量,因此您无需对速度进行微优化。


推荐阅读