你可以使用如下流程控制符:

  • if and else
  • for loops
  • while and do-while loops
  • break and continue
  • switch and case
  • assert

    同时,你可以用try-catch 和throw去跳出流程控制逻辑,并在异常代码块中进行处理。

If and else

下面是if和else配合使用的示例:

if (isRaining()) {
you.bringRainCoat();
} else if (isSnowing()) {
you.wearJacket();
} else {
car.putTopDown();
}

有点要注意,Dart语言不像JavaScript,if判断必须是Boolean类型对象,不能将null看作false

For loops

for循环示例:

var message = StringBuffer('Dart is fun');
for (var i = 0; i < 5; i++) {
message.write('!');
}

在for循环中局部变量再闭包函数中使用,变量值将会是当时的快照值,后续i变动,也不会改变。这个和JavaScript不同。

var callbacks = [];
for (var i = 0; i < 2; i++) {
callbacks.add(() => print(i));
}
callbacks.forEach((c) => c());

上面的代码,将先输出0,再输出1。而在JavaScript中,都是输出2,这就是两个之间的一个差异

对一个数组对象循环时,如果你不需要知道循环的计数器,可以用forEach写法。

candidates.forEach((candidate) => candidate.interview());

数组或者集合也可以用for-in的写法做循环。

var collection = [0, 1, 2];
for (var x in collection) {
print(x); // 0 1 2
}

While and do-while

while是前置判断的循环写法:

while (!isDone()) {
doSomething();
}

do-while 是后置判断的循环写法:

do {
printLine();
} while (!atEndOfPage());

Break and continue

你可以用break终止循环:

while (true) {
if (shutDownRequested()) break;
processIncomingRequests();
}

可以用continue 跳过循环中的一次操作:

for (int i = 0; i < candidates.length; i++) {
var candidate = candidates[i];
if (candidate.yearsExperience < 5) {
continue;
}
candidate.interview();
}

如果你是对数组或者集合操作,可以用如下写法:

candidates
.where((c) => c.yearsExperience >= 5)
.forEach((c) => c.interview());

Switch and case

switch可以用数值,字符串,编译常量作为判断值,case后面的对象必须在类中初始化,不能在父类中,通过该对象的类不能重载==。另外,枚举类型也可以作为判断条件。

非空的case,必须使用break,coutinue,throw,return 结束,否则将编译错误。

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必须break,除非你采用coutinue进行跳转。

var command = 'OPEN';
switch (command) {
case 'OPEN':
executeOpen();
// ERROR: Missing break case 'CLOSED':
executeClosed();
break;
}

Dart支持空的case,处理逻辑和其后续case相同。

var command = 'CLOSED';
switch (command) {
case 'CLOSED': // Empty case falls through.
case 'NOW_CLOSED':
// Runs for both CLOSED and NOW_CLOSED.
executeNowClosed();
break;
}

如果在非空的case中,你希望switch继续向下判断,可以用continue +label来实现。

var command = 'CLOSED';
switch (command) {
case 'CLOSED':
executeClosed();
continue nowClosed;
// Continues executing at the nowClosed label. nowClosed:
case 'NOW_CLOSED':
// Runs for both CLOSED and NOW_CLOSED.
executeNowClosed();
break;
}

case的代码块中的定义的都是局部变量,只能在其中可见。

Assert

使用assert用来在false条件下,抛出异常来中断程序执行。

// Make sure the variable has a non-null value.
assert(text != null); // Make sure the value is less than 100.
assert(number < 100); // Make sure this is an https URL.
assert(urlString.startsWith('https'));

注意:assert在生产模式将被忽略。Flutter可以通过debug模式启用assert,IDE上面,只有dartdevc默认支持dart,其它工具,比如dart,dart2js,需要用--enable-asserts来开启assert

assert的带2个参数写法:

assert(urlString.startsWith('https'),
'URL ($urlString) should start with "https".');

第六篇准备翻译 Exceptions 异常

5.Control flow statements-流程控制(Dart中文文档)的更多相关文章

  1. 4.Operators-操作符(Dart中文文档)

    Dart有如下操作符: Description Operator unary postfix expr++ expr-- () [] . ?. unary prefix -expr !expr ~ex ...

  2. 2.Built-in types-基本数据类型(Dart中文文档)

    初次翻译,部分内容并非按字面翻译,是按本人理解进行了内容重组.如有错误望指正. Dart语言内置如下数据类型: numbers strings booleans lists (所谓的数组) maps ...

  3. 1.Variables-变量(Dart中文文档)

    初次翻译,部分内容并非按字面翻译,是按本人理解进行了内容重组.如有错误望指正. 如下是变量定义和赋值的示例 var name = 'Bob'; 变量存储的是一个引用地址.如上的变量name指向了一个值 ...

  4. 8.Generics 泛型(Dart中文文档)

    这篇翻译的不好 如果你看API文档中的数组篇,你会发现类型一般写成List.<...>的写法表示通用类型的数组(未明确指定数组中的数据类型).通常情况泛型类型用E,T,S,K,V表示. W ...

  5. 7.Classes-类(Dart中文文档)

    Dart是一个面向对象的语言,同时增加了混入(mixin)继承的特性.对象都是由类初始化生成的,所有的类都由Object对象继承.混入继承意味着尽管所有类(除了Object类)只有一个父类,但是类的代 ...

  6. 6.Exceptions-异常(Dart中文文档)

    异常是用于标识程序发生未知异常.如果异常没有被捕获,If the exception isn't caught, the isolate that raised the exception is su ...

  7. 3.Functions-函数(Dart中文文档)

    初次翻译,部分内容并非按字面翻译,是按本人理解进行了内容重组.如有错误望指正. Dart是完全的面向对象的语言,甚至函数也是一个Function类型的对象.这意味着函数可以赋值给变量或者作为函数的参数 ...

  8. Flutter 中文文档网站 flutter.cn 正式发布!

    在通常的对 Flutter 介绍中,最耳熟能详的是下面四个特点: 精美 (Beautiful):充分的赋予和发挥设计师的创造力和想象力,让你真正掌控屏幕上的每一个像素. ** 极速 (Fast)**: ...

  9. Apache Spark 2.2.0 中文文档

    Apache Spark 2.2.0 中文文档 - 快速入门 | ApacheCN Geekhoo 关注 2017.09.20 13:55* 字数 2062 阅读 13评论 0喜欢 1 快速入门 使用 ...

随机推荐

  1. CSS深入理解之overflow(HTML/CSS)

    简介 overflow看上去其貌不扬,其中蕴含的知识点还是很多的,有很多鲜为人知的特性表现. overflow基本属性值 1.visible(默认) 2.hidden 3.scroll 4.auto ...

  2. python queue和生产者和消费者模型

    queue队列 当必须安全地在多个线程之间交换信息时,队列在线程编程中特别有用. class queue.Queue(maxsize=0) #先入先出 class queue.LifoQueue(ma ...

  3. zabbix系列之四——快速使用

    https://www.zabbix.com/documentation/3.4/manual/quickstart/login Quickstart 1login and configuring u ...

  4. HTML5-入门3。

    CSS选择器. 什么是标签选择器?作用: 根据指定的标签名称, 在当前界面中找到所有该名称的标签, 然后设置属性 格式: 标签名称{ 属性:属性值 } 标签选择器(html中的标签名称) id选择器( ...

  5. 网站换了HTTPS后残留部分http处理方式

    网站换了HTTPS后残留部分http处理方式,以前添加的文章里面是有http的,导致浏览器打开网站的时候提示证书不安全,解决方法很简单 在html页面上加上这一段话 <!-- 强制让http的访 ...

  6. Oracle EBS 获取用户挂的职责 请求 请求的类别(RTF还是什么的)

    select fu.user_ID, fu.user_name, fu.start_date, fu.END_DATE, fu.description, fe.last_name, fr.RESPON ...

  7. ubuntu-15.04-desktop-amd64想要安装KDE桌面,结果出现如下问题

    The following packages have unmet dependencies: kubuntu-desktop : Depends: ark but it is not going t ...

  8. Linux fsck命令详解

    fsck(file system check)用来检查和维护不一致的文件系统.若系统掉电或磁盘发生问题,可利用fsck命令对文件系统进行检查. fsck常见命令参数 -a:自动修复文件系统,不询问任何 ...

  9. oracle PL/SQL调用Java生成Excel

    现在有个需求,  要求编写oracle存储过程生成Excel文件到指定目录,  但是oracle自己的API貌似不太给力,  所以只能通过另一种更强大的语言来实现了  ——Java.有一个Java框架 ...

  10. Collection集合 总结笔记

    2:Set集合(理解)     (1)Set集合的特点         无序,唯一     (2)HashSet集合(掌握)         A:底层数据结构是哈希表(是一个元素为链表的数组)     ...