为什么这段代码有效?
child: Column(
children:
[
for (dynamic answer in answersToQuestion)
Row(
children: [
Checkbox(
activeColor: Style.primaryColor,
onChanged: (value) {
setState(() {
answerControllers[question["id"]][answer["libelle"]] = value;
});
},
value: answerControllers[question["id"]][answer["libelle"]],
),
Expanded(
child: FlatButton(
padding: EdgeInsets.all(0),
onPressed: () {
setState(() {
answerControllers[question["id"]][answer["libelle"]] = !answerControllers[question["id"]][answer["libelle"]];
});
},
child: Align(
alignment: Alignment.centerLeft,
child: Text(
answer["libelle"],
overflow: TextOverflow.ellipsis,
),
)
)
)
],
),
],
)
);
但是,这个根本不起作用吗?
child: Column(
children:
[
for (dynamic answer in answersToQuestion) {
Row(
children: [
Checkbox(
activeColor: Style.primaryColor,
onChanged: (value) {
setState(() {
answerControllers[question["id"]][answer["libelle"]] = value;
});
},
value: answerControllers[question["id"]][answer["libelle"]],
),
Expanded(
child: FlatButton(
padding: EdgeInsets.all(0),
onPressed: () {
setState(() {
answerControllers[question["id"]][answer["libelle"]] = !answerControllers[question["id"]][answer["libelle"]];
});
},
child: Align(
alignment: Alignment.centerLeft,
child: Text(
answer["libelle"],
overflow: TextOverflow.ellipsis,
),
)
)
)
],
),
}
],
));
我在
foreach
中添加了方括号,它没有改变任何东西,但是第二个代码不起作用,逻辑是什么?
我相信
foreach () { justOne }
和foreach () justOne
是一样的。如果没有,为什么?
不同之处在于,代码块可以由单行或多行组成:在后者中,您必须用大括号将代码行括起来,以便编译器知道大括号内的整个代码必须被视为单个代码堵塞。 举个例子:
if (something) {
print(stuff);
save();
setState((){});
}
如果
something
为true,则由于大括号的原因,会执行大括号中的整个代码
if (something)
print(stuff);
save();
setState((){});
在此示例中,如果
something
为 true,则仅执行 print
,因为(通常)if
条件仅执行后面的第一个代码块,在这种情况下,该块仅由 print
组成
,而无论 something
值如何,其他两行都会执行。
代码格式和缩进对于理解这一点有很大帮助:事实上,第二个示例通常以另一种方式格式化,只是为了更容易理解:
if (something) print(stuff);
save();
setState((){});
在这种特定情况下,您正处于小部件声明的中间,这意味着代码块必须始终由单个代码行组成,因此您的第二段代码会引发错误。
它们不一样,实际上
for (dynamic variable in myList)
语法有点新,它帮助我们改进了在新类实例中映射列表元素的旧方式。
举个例子
想象你有一个班级测试
class Test {
String name;
Test({ required this.name });
@override
String toString() {
return this.name;
}
}
你有一个名字列表:
const names = ['hey', 'test', 'op'];
在 Dart 2.3 之前,将 List 映射到类实例(或 Flutter 中的 Widget)的唯一方法如下:
final list1 = names.map((name) => Test(name: name)).toList(); print(list1); // [hey, test, op]
现在你可以这样做(你当前的方法):
final list2 = [for (String name in names) Test(name: name)];
print(list2) // [hey, test, op]
如果你添加括号,因为这是一个非常特殊的语法,Dart 可以以非预期的方式接受它
final list3 = [for (String name in names) {
Test(name: name)
}];
print(list3); // [{hey}, {test}, {op}]
而且,实际上,
list3
的类型是List<Set<String>>
,而不是List<String>
,Flutter的属性通常在List<Widget>
类型下工作。
希望这有助于理解这种行为,但我邀请您在 Dart Pad 中玩一下:)