可以使用以下方式来控制Dart代码的流:
- if 、 else
- for 循环
- while 、do...while 循环
- break 、continue
- switch 、case
- assert
if、else
Dart支持if语句和可选的else语句,示例如下:
if (isRaining()) {
//todo
} else if (isSnowing()) {
//todo
} else {
//todo
}
条件语句必须是返回值为布尔值的表达式,而不是其他表达式。
for循环
可以使用标准的for循环进行迭代。例如:
for (var i = 0; i < 5; i++) {
print(${i});
}
Dart for循环中的闭包捕获索引的值,避免了JavaScript中常见的一个陷阱。代码如下:
var callbacks = [];
for (var i = 0; i < 2; i++) {
callbacks.add(() => print(i));
}
callbacks.forEach((c) => c());
在Dart中如预期一样先输出是0,然后是1;但是该示例在JavaScript中两次打印的都是2。
如果正在迭代的对象是一个Iterable(如List或Set),并且不需要知道当前的迭代计数器,可以直接使用for-in形式的迭代。如下:
for (final item in list) {
print(item);
}
迭代类还有一个forEach()方法:
var collection = [1, 2, 3];
collection.forEach(print); // 1 2 3
while、do-while
while循环在循环之前计算条件:
//未做完某事情,则一直执行doSomething(),直到达成则跳出循环
while (!isDone()) {
doSomething();
}
do...while循环类似于while循环,只是do...while循环不会在第一次循环执行时评估条件。但是它也会针对后续迭代评估条件。也就是说在do...while循环中至少执行代码块一次。
do {
Statement(s) to be executed;
} while (expression);
do...while循环结束时需要使用的分号
break、continue
break用于停止循环:
var list = [1,2,3,4,5];
for (var item in list) {
if(item == 3){
break;
}
print(${item});
}
//输出1 2
ccontinue用于跳到下一个循环迭代:
var list = [1,2,3,4,5];
for (var item in list) {
if(item == 3){
continue;
}
print(${item});
}
//输出1 2 4 5
switch、case
Dart中的switch语句使用==比较整数、字符串或编译时常量。比较对象必须都是同一个类的实例(而不是它的任何子类型)。枚举类型也可以用于switch。
- 每个非空case子句通常以break语句结束。
- 结束非空case子句,也可以使用continue、throw或return。
- 当没有case子句匹配时,使用default子句执行代码。
示例代码如下:
var command = 'OPEN';
switch (command) {
case 'CLOSED':
executeClosed();
break;
case 'PENDING':
executePending();
break;
case 'APPROVED':
executeApproved();
break;
case 'DENIED':
executeDenied();
break;
case 'OPEN':
executeOpen();
break;
default:
executeUnknown();
}
Dart支持空的case子句:
var command = 'CLOSED';
switch (command) {
case 'CLOSED':
case 'NOW_CLOSED':
// CLOSED、NOW_CLOSED都是执行以下方法
executeNowClosed();
break;
}
asset(断言)
在开发过程中,使用assert语句——assert(condition, optionalMessage)。如果布尔条件为假,则中断正常执行。
// 确保text是一个非空的值.
assert(text != null);
// 确保number的值小于100.
assert(number < 100);
// 确保urlString是以https开头
assert(urlString.startsWith('https'));
如果要将消息附加到断言,可以添加一个字符串作为assert的第二个参数
assert(urlString.startsWith('https'),
'URL ($urlString) should start with "https".');
assert的第一个参数可以是返回值为布尔值的任何表达式,如果表达式的值为true,则断言成功并继续执行;如果为false,断言失败并抛出异常(AssertionError)
断言到底什么时候起作用? 取决于使用的工具和框架:
- Flutter支持在调试模式下断言;
- 仅用于开发的工具,如dartdevc,通常在默认情况下支持断言;
- 有些工具,比如dart run和dart2js,可以通过命令行标记:--enable-asserts。