列表中 foreach 的正确语法

问题描述 投票:0回答:2

为什么这段代码有效?

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
是一样的。如果没有,为什么?

flutter dart
2个回答
1
投票

不同之处在于,代码块可以由单行或多行组成:在后者中,您必须用大括号将代码行括起来,以便编译器知道大括号内的整个代码必须被视为单个代码堵塞。 举个例子:

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((){});

在这种特定情况下,您正处于小部件声明的中间,这意味着代码块必须始终由单个代码行组成,因此您的第二段代码会引发错误。


1
投票

它们不一样,实际上

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 中玩一下:)

© www.soinside.com 2019 - 2024. All rights reserved.