总目录
Flutter开发指南之理论篇:Dart语法01(数据类型,变量,函数)
Flutter开发指南之理论篇:Dart语法02(运算符,循环,异常)
Flutter开发指南之理论篇:Dart语法03(类,泛型)
Flutter开发指南之理论篇:Dart语法04(库,异步,正则表达式)
Dart是一门面向对象语言,它针对web 和移动设备开发进行了优化,主要特点为:
- 一切皆对象!无论是数字,函数还是null,所有对象继承自Object类;
- 声明一个变量时可以不指定具体类型,Dart可以自动推断类型;
- Dart支持顶层函数,函数是一等对象,且函数可作为参数传递;
- Dart使用
_
开头表示私有属性,没有关键字public
,protected
和private
;
1. 运算符
类型 | 运算符 | 说明 |
---|---|---|
算术运算符 | + - * / ~/ % ++ – | 其中,/结果是浮点型,~/结果是整型,%求余 |
关系运算符 | == != > < >= <= | 无 |
类型判断运算符 | as is is! | 其中,as用于强制类型转换,is判断对象类型,is!作用与is相反 |
赋值运算符 | ??= = -= /= %= >>= ^=等复合运算 | 其中,??=只有被赋值的变量为null才会成功,否则保持不变 |
逻辑运算符 | ! || && | 无 |
位运算符 | & | ^ ~ << << | 其中,~表示按位取反 |
条件表达式 | condition ? expr1 : expr2 , expr1 ?? expr2 | 其中,??表示expri1非空返回expri1,否则返回expri2 |
其他运算符 | () [] . | 其中,()表示函数调用,[]访问列表元素,.访问对象成员(属性和方法)) |
除了上述常见的运算符,dart中还提供了两个特殊的运算符:..
(级联运算符)和?.
:
- 级联运算符(
..
)
级联运算符 (…) 可以实现对同一个对像进行一系列的操作。除了调用函数,还可以访问同一对象上的字段属性。
querySelector('#confirm') // 获取对象。
..text = 'Confirm' // 调用成员变量。
..classes.add('important') // 调用成员方法
..onClick.listen((e) => window.alert('Confirmed!'));
// 等价于
var button = querySelector('#confirm');
button.text = 'Confirm';
button.classes.add('important');
button.onClick.listen((e) => window.alert('Confirmed
// 级联运算
// 嵌套操作
final addressBook = (AddressBookBuilder()
..name = 'jenny'
..email = 'jenny@example.com'
..phone = (PhoneNumberBuilder()
..number = '415-555-0100'
..label = 'home')
.build())
.build();
注意:在返回对象的函数中谨慎使用级联操作符。
- 访问对象成员运算符(
?.
)
相比于访问对象成员运算.
,(?.
)允许对象为null,能够有效避免NullPointException异常。
var button = querySelector('#confirm');
// 如果button=null,会调用失败,不会报NPE异常
button?.text = 'Confirm';
2. 控制流程语句
2.1 if和else
Dart支持if - else语句,其中else是可选的。
if (isRaining()) {
you.bringRainCoat();
} else if (isSnowing()) {
you.wearJacket();
} else {
car.putTopDown();
}
2.2 for循环
var message = StringBuffer('Dart is fun');
for (var i = 0; i < 5; i++) {
message.write('!');
}
如果要迭代一个实现了Iterable接口的对象,比如List/Set,可以使用forEach()
和for-in
。
- forEach使用
var callbacks = [];
// 向列表添加0,1
for (var i = 0; i < 2; i++) {
callbacks.add(() => print(i));
}
// 输出0,1
callbacks.forEach((c) => c());
- for-in使用
var collection = [0, 1, 2];
for (var x in collection) {
print(x); // 0 1 2
}
2.3 while和do…while
// while循环
// 先判断,再执行
while (!isDone()) {
doSomething();
}
// do...while循环
// 先执行,再判断
do {
doSomething();
} while (!isDone());
2.4 switch…case
var command = 'OPEN';
switch (command) {
case 'CLOSED':
executeClosed();
break;
case 'OPEN':
executeOpen();
break;
default:
executeUnknown();
}
在case语句中,每个非空的 case 语句结尾需要跟一个break
语句。除 break以外,还有可以使用continue
, throw
,者return
。当然,Dart支持空case语句,允许程序以fall-through的形式执行。
var command = 'OPEN';
switch (command) {
// ‘CLOSED’和'OPEN'只要匹配上其中的一个
// 便可执行executeOpen
case 'CLOSED':
case 'OPEN':
executeOpen();
break;
}
上述fall-through代码等价于:
var command = 'OPEN';
switch (command) {
// 如果匹配的是'CLOSED'
// executeClosed和executeOpen均会被执行
case 'CLOSED':
executeClosed();
continue nowClosed;
nowClosed:
case 'OPEN':
executeOpen();
break;
}
无论是for/while/do…while,还是switch…case,均可使用contiue
和break
操作控制流程,前者用于跳转到下一次迭代,后者用于停止循环。
3. 异常处理
和Java不同,Dart中所有的异常都是非检查异常
,即在Dart中的方法不会声明它们抛出的异常,也不要求调用者必须捕获任何异常。Dart提供了Exception
和Error
类型异常,包括它们的子类,实际上,Dart语言允许抛出任何非null对象,不仅限于Exception和Error对象。
3.1 throw
Dart中使用throw
抛出一个异常或者任何非null对象。
// 抛出异常
void test() {
...
throw FormatException('format incurrent');
}
// 抛出任何对象
// 这里抛出一个String对象
throw "Hell World"
3.2 try…catch…finally
和java一样,Dart也是使用try...catch...finally
来捕获异常,而关键字on
用于指定具体的类型。
// 处理指定类型的异常
try {
test()
} on FormatException catch (e) {
handleFormatException()
}
// 其中,catch可以省略
// 上述代码等价于
try {
test()
} on FormatException {
handleFormatException()
}
指定多个catch,用于捕获处理可能抛出的多种类型异常。
try {
test()
} on FormatException {
// 捕获具体类型的异常
handleFormatException()
} catch(e) {
// 没有指定具体类型,捕获所有异常
handleUnkown()
}
另外,catch()函数可以指定1到2个参数,第一个参数为抛出的异常对象,第二个为堆栈信息 (一个StackTrace对象)。
try {
// ···
} on Exception catch (e) {
// 处理Exception异常,及其子类
print('Exception details:\n $e');
} catch (e, s) {
// 处理所有抛出的对象,包括异常
print('Exception details:\n $e');
print('Stack trace:\n $s');
} finally {
// 无论catch是否执行
// finally永远会被执行,规则如下:
// 如果没有任何catch,执行try后,直接执行finally
// 如果有catch,执行try后,先执行finally,再执行catch
print('always arrived.');
}
参考文献: