变量

  • 变量:var、dynamic、”type-defined“
  • 常量:const(编译时就已经固定了常量的值)、final(编译时就已经不确定了常量的值,第一次初始化时才固定)

  • 默认值:null

内建类型

  • Number:int、double
  • String:String、Runes
  • Boolean:bool

  • List:List

  • Map:Map(除了直接{},也可以用Map())
  • Set:Set(由于直接var s = {}会给s赋一个Map,所以应该明确指定s为Set\<xxx>类型)

  • Symbol:略

函数特性

  • Dart中函数是一等公民:可以将函数作为参数、变量的值。
  • 所有函数都会返回值(即使返回值为void),如果不显式返回,默认返回null
  • 单行lambda

0. main函数

  • 参数为可选的List\<String>
  • 返回值为void

1. 可选参数

  • 位置可选参数([]型参数)
  • 定义:String say(String from, String msg, [String device]) {...}
  • 默认值:String device = true(使用等号)
  • 命名可选参数({}型参数)
  • 定义:void enableFlags({bool bold, bool hidden}) {...}
  • 调用:enableFlags(bold: true, hidden: false);
  • 默认值:bool hidden = true(使用等号)
  • {}型可选参数的必选化:const Scrollbar({Key key, @required Widget child}){...}
    • 使用了@required注解;这表示Widget child必须传入,否则会报错误

2. 级联调用

void main() {
  querySelector('#sample_text_id')
    ..text = 'Click me!'
    ..onClick.listen(reverseText);
}
  • querySelector('#sample_text_id')产生了一个对象,假设为obj
  • 则..text和..onClick就是分别在obj进行的两次操作
  • (注意区别..调用和.调用)

3. 匿名函数

  • 语法:(参数列表){函数体}
  • 单行lambda语法:(参数列表) => 返回值

特殊表达式

  • 基本运算符:略

  • /与~/

  • A / B:double除法,结果均为double(不会产生截断)
  • A ~/ B:int除法,结果均为int(会产生截断)
  • is、is!、as
  • A is Type:匹配对象的类型,A的类型是Type,则返回真
  • (A as Type).TypeMethod():A通过is进行判断,如果为真,转型为Type;如果为假,则抛出异常
  • ?:、??
  • A ? B : C:略
  • A ?? B:等价于A != null ? A : B
  • .调用、..调用、?.调用
  • A.B调用:略
  • A..B调用:略
  • A?.B调用:如果A为null,上述调用会报错,但A?.B仅会返回null(对null的任何调用都是null)

控制流程

  • 基本控制流程:略

  • switch-case语句

  • case语句可以拥有局部作用域

  • 如果case为空,且不break,则会直接执行下一个case
  • 如果case不为空,且不break,则需要手动设置label,并且使用continue LABEL来指定下一个执行的case

```dart var command = 'CLOSED'; switch (command) { case 'CLOSED': executeClosed(); continue nowClosed;// 结束后执行nowClosed标签后的代码

nowClosed:
case 'NOW_CLOSED':
  executeNowClosed();
  break;

} ```

异常

  • assert

  • throw

  • try-catch-finally

类与对象

1. 基础

  • new是可选的
  • obj.runtimeType可以动态获取对象的类型
  • this:获取当前类的对象,仅用于重名时。

2. 构造函数

  • 默认构造函数定义

```dart class Point { num x, y;

Point(this.x, this.y);
    // 等价于:
  // Point(num x, num y) {
  //     this.x = x;
  //     this.y = y;
  // }

} ```

  • 命名构造函数定义

dart ClassName.name(...)

  • 可以满足不同参数的初始化要求

  • 例子

    ```dart // 定义 class Student { String name; int age;

    Student(this.name, this.age);
    Student.withAge(this.age) : name = 'Unknown';
    

    }

    // 调用 void main() { var s1 = Student('Alice', 20); var s2 = Student.withAge(30); } ```

  • 重命名构造函数定义:略

  • 常量构造函数定义

```dart class ImmutablePoint { static final ImmutablePoint origin = const ImmutablePoint(0, 0);

    final num x, y;

    const ImmutablePoint(this.x, this.y);

}

var a = ImmutablePoint(1, 1); var b = ImmutablePoint(1, 1); ```

  • 两个相同的编译时常量会产生一个唯一的, 标准的实例:此时a和b的对象相等。
  • 常量上下文内,构造函数或者字面量前的 const 可以省略。

2.Getter和Setter方法

  • 类名.类属性:会调用类属性的getter/setter方法
class Rectangle {
  num left, top, width, height;

  Rectangle(this.left, this.top, this.width, this.height);

  // 定义两个计算属性: right 和 bottom。
  num get right => left + width;
  set right(num value) => left = value - width;
  num get bottom => top + height;
  set bottom(num value) => top = value - height;
}

void main() {
  var rect = Rectangle(3, 4, 20, 15);
  assert(rect.left == 3);
  rect.right = 12;
  assert(rect.left == -8);
}