dart学习笔记

类型检测操作符

运算符 含义
as 定型
is 如果对象具有指定的类型,则为 True
is! 如果对象具有指定的类型,则为 False

使用 as 操作符将对象转换为特定类型。通常,您应该使用它作为在对象上进行 is 测试的简写,后面是使用该对象的表达式。例如,考虑以下代码:

1
2
3
4
if (eat is Person) {
// Type check
eat.food = 'apple';
}

您可以使用 as 运算符使代码更短:

1
(eat as Person).food = 'apple';

注意:以上代码不相等。如果 eat 为空或不为 Person,第一个示例(带 is)什么也不做;第二个(带有 as)抛出异常。

赋值操作符

正如您已经看到的,可以使用=操作符赋值。如果指定的变量为空,则使用??=运算符。

1
2
3
4
// 赋值给a
a = value;
// 如果b为空,则赋值给b;否则,b保持不变
b ??= value;

级联符号(..)

级联(..)允许对同一对象进行一系列操作。除了函数调用外,您还可以访问同一对象上的字段。这通常可以省去创建临时变量的步骤,并允许您编写更流畅的代码。
考虑以下代码:

1
2
3
4
querySelector('#confirm') // Get an object.
..text = 'Confirm' // Use its members.
..classes.add('important')
..onClick.listen((e) => window.alert('Confirmed!'));

第一个方法调用 querySelector()返回选择器对象。级联表示法后面的代码操作这个选择器对象,忽略可能返回的任何后续值。上例等价于:

1
2
3
4
var button = querySelector('#confirm');
button.text = 'Confirm';
button.classes.add('important');
button.onClick.listen((e) => window.alert('Confirmed!'));

你也可以嵌套你的级联。例如:

1
2
3
4
5
6
7
8
final addressBook = (AddressBookBuilder()
..name = 'jenny'
..email = 'jenny@example.com'
..phone = (PhoneNumberBuilder()
..number = '415-555-0100'
..label = 'home')
.build())
.build();

要小心在返回实际对象的函数上构造级联。例如,以下代码失败:

1
2
3
var sb = StringBuffer();
sb.write('foo')
..write('bar'); // Error: method 'write' isn't defined for 'void'.

调用 sb.write()返回 void,并且不能在 void 上构造级联。
注意:严格地说,级联的“双点”符号不是运算符。这只是 Dart 语法的一部分。