-
Notifications
You must be signed in to change notification settings - Fork 17
Description
变量
var name = 'Bob';
Default value(默认值)
没有初始化的变量自动获取一个默认值为 null。
int lineCount;
assert(lineCount == null);
// Variables (even if they will be numbers) are initially null.
Optional types(可选的类型)
在声明变量的时候,你可以选择加上具体 类型:
String name = 'Bob';
添加类型可以更加清晰的表达你的意图。 IDE 编译器等工具有可以使用类型来更好的帮助你, 可以提供代码补全、提前发现 bug 等功能。
Final and const
如果你以后不打算修改一个变量,使用 final 或者 const。 一个 final 变量只能赋值一次;一个 const 变量是编译时常量。 (Const 变量同时也是 final 变量。) 顶级的 final 变量或者类中的 final 变量在 第一次使用的时候初始化。
Built-in types(内置的类型)
Dart 内置支持下面这些类型:
- numbers
- int
- double
- strings
- booleans
- lists(array)
- maps
- runs(用于在字符串中表示 Unicode 字符)
- symbols
使用三个单引号或者双引号也可以 创建多行字符串对象
var s1 = '''
You can create
multi-line strings like this one.
''';
var s2 = """This is also a
multi-line string.""";
Dart 有一个名字为 bool 的类型。 只有两个对象是布尔类型的:true 和 false 所创建的对象, 这两个对象也都是编译时常量。
赋值操作符
??=
操作符用来指定 值为 null 的变量的值。
b ??= value; // 如果 b 是 null,则赋值给 b;
// 如果不是 null,则 b 的值保持不变
条件表达式
expr1 ?? expr2
如果 expr1
是 non-null
,返回其值; 否则执行 expr2
并返回其结果。
级联操作符 ..
级联操作符 (..
) 可以在同一个对象上 连续调用多个函数以及访问成员变量。 使用级联操作符可以避免创建 临时变量, 并且写出来的代码看起来 更加流畅:
例如下面的代码:
querySelector('#button') // Get an object.
..text = 'Confirm' // Use its members.
..classes.add('important')
..onClick.listen((e) => window.alert('Confirmed!'));
第一个方法 querySelector()`` 返回了一个
selector` 对象。 后面的级联操作符都是调用这个对象的成员, 并忽略每个操作 所返回的值。
上面的代码和下面的代码功能一样:
var button = querySelector('#button');
button.text = 'Confirm';
button.classes.add('important');
button.onClick.listen((e) => window.alert('Confirmed!'));
断言(Assert)
如果条件表达式结果不满足需要,则可以使用 assert
语句俩打断代码的执行。 下面介绍如何使用断言。 下面是一些示例代码:
// 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'));
注意: 断言只在检查模式下运行有效,如果在生产模式 运行,则断言不会执行。
库
使用 import
来指定一个库如何使用另外 一个库。import
必须参数为库的 URI
。 对于内置的库,URI
使用特殊的 dart: scheme
。 对于其他的库,你可以使用文件系统路径或者 package: scheme
。 package: scheme
指定的库通过包管理器来提供, 例如 pub
工具。
import 'dart:io';
import 'package:mylib/mylib.dart';
import 'package:utils/utils.dart';
Lazily loading a library(延迟载入库)
Deferred loading
(也称之为 lazy loading
) 可以让应用在需要的时候再 加载库。 下面是一些使用延迟加载库的场景:
- 减少 APP 的启动时间。
- 执行 A/B 测试,例如 尝试各种算法的 不同实现。
- 加载很少使用的功能,例如可选的屏幕和对话框。
- 要延迟加载一个库,需要先使用
deferred as
来 导入:
import 'package:deferred/hello.dart' deferred as hello;
当需要使用的时候,使用库标识符调用 loadLibrary()
函数来加载库:
greet() async {
await hello.loadLibrary();
hello.printGreeting();
}
元数据(Metadata)
使用元数据给代码添加更多的信息。
元数据是以@
开始的修饰符。在`@`` 后面接着编译时的常量或调用一个常量构造函数。
目前Dart语言提供的三个可用的@修饰符:
- @deprecated 被弃用的
- @OverRide 重载
- @Proxy 代理
工厂构造函数
- 工厂构造函数是一种构造函数,与普通构造函数不同,工厂函数不会自动生成实例,而是通过代码来决定返回的实例对象。
- 工厂构造函数的关键字为
factory
,下面我们用工厂构造函数写一个只能创造一个实例的类。 - 工厂构造函数类似于
static
静态成员,无法访问this
指针,所以在工厂构造函数中能处理的任务较为有限。 - 使用工厂构造函数时往往需要定义一个命名构造函数用来生产实例。
例子:
class Model {
final String id;
final String name;
Recommend({this.id, this.name});
factory Model.fromJson(Map<String, dynamic> json) {
return Model(
id: json['id'],
name: json['name']
);
}
}