声明字段关键字
- var:用来修饰变量。
- const:用来修饰常量,编译时需要一个确定的值,一般会赋值一个常量值。
- final:用来修饰常量,运行时需要一个确定的值,可以赋值一个表达式。
main(List<String> args) {
var name = "jack";
final age = getAge();
const height = 2.0;
// const height = getHeight();这句代码会报错
}
getAge() {
return 20;
}
getHeight() {
return 2.0;
}
布尔值
值为 true 和 false。判断表达式必须为 Bool 类型,Dart 不支持 非 0 即真和非空即真。
格式化输出
使用 ${}的格式来拼接字段。若拼接的为变量或者常量,则 {} 可省略,若拼接的为表达式则 {} 不可省略。
var name = "jack";
final age = 20;
const height = 2.0;
print("name is $name, age is $age, height is $height");
print(" age type is ${age.runtimeType});
运算符
- ?? :用来给值为空的变量提供默认值(与 Swift 中的解包给默认值作用一样)。
var name = "jack";
var null_name = null;
print("name is $name, null_name is $null_name");
final result = null_name ?? "default";
print("result is $result");
- 级联运算符
函数
- Dart 中函数为一等公民。
- Dart 中没有函数重载。
- Dart 中的可选参数,只有可选参数才有默认值。
- 位置可选,用 [] 修饰。强调位置,顺序不能搞错。
run("aaa", 1); // run("aaa", 1.0); 会报错,因为 age 为 int 类型 void run(String name, [int? age, double? height]) {}- 命名可选,用 {} 修饰。不强调顺序,一般使用这个。
run("aaa", age: 1); void run(String name, {int? age, double? height}) {} - 匿名函数
typedef Handler = void Function();
void send(Handler handler) {
handler();
}
send(() {
print("send function");
});
- 箭头函数:函数体只有一行的匿名函数
send(() => print("send function"));
- 必传参数:必须传的参数,不传编译直接报错; @require 可选命名参数的注解,不传编译不报错,但有警告。
类
- 构造函数语法糖
class Person {
String name = "";
int age = 0;
Person(this.name, this.age); // 效果等同下面
// Person(String name, int age) {
// this.name = name;
// this.age = age;
// }
}
- Object 与 dynamic
// 编译报错
Object name = "abcd";
print(name.substring(1));
// 编译不报错可正常运行,存在安全隐患,可能会类型不对导致方法找不到。
dynamic name2 = "abcd";
print(name2.substring(1));
- 重定向构造函数。
class Person {
String name;
String level;
Person(String name) : this._internal(name, "default");
// 重定向构造函数
Person._internal(this.name, this.level);
}
- 工厂构造函数,通过 factory 关键字标识。它可以手动返回对象。
class Person {
String name;
String level;
Person(String name) : this._internal(name, "default");
Person._internal(this.name, this.level);
// 工厂构造函数的实现
factory Person.WithNameAndLevel(String name, String level) {
if (name.isEmpty) {
return Person("default");
} else {
Person p = Person(name);
p.level = level;
return p;
}
}
}
- 常量构造函数,每个类只能有一个常量构造函数。
class Person {
final String name;
const Person(this.name);
}
- 抽象类,使用
abstract标识。继承自抽象类的子类必须实现抽象方法。类似于 Swift 中的 protocol。
abstract class DoHomeWork {
void dowork();
}
class Person extends DoHomeWork {
@override
void dowork() {
print("dowork");
}
}
- mixin,使用 mixin 和 with 关键字。
mixin DoHomeWork {
void dowork();
}
class Person with DoHomeWork {
void dowork() {
print("dowork");
}
}
- 库的使用
- 可以使用 as 关键字给库起别名。
- 导入默认会导入所有的代码,可以使用 show 或 hide 来控制。
- _ 用来区分公开和私有。