1、默认状态下,为初始化的变量值都为null
2、箭头函数简化书写:
bool isZero(int number) => number == 0;
3、给参数增加{},以 paramName: value 的方式指定调用参数,也就是可选命名参数;
给参数增加 [],则意味着这些参数是可以忽略的,也就是可选参数;
// 要达到可选命名参数的用法,那就在定义函数的时候给参数加上 {}
void enable1Flags({bool bold, bool hidden}) => print("$bold , $hidden");
// 定义可选命名参数时增加默认值
void enable2Flags({bool bold = true, bool hidden = false}) => print("$bold ,$hidden");
// 可忽略的参数在函数定义时用 [] 符号指定
void enable3Flags(bool bold, [bool hidden]) => print("$bold ,$hidden");
// 定义可忽略参数时增加默认值
void enable4Flags(bool bold, [bool hidden = false]) => print("$bold ,$hidden");
// 可选命名参数函数调用
enable1Flags(bold: true, hidden: false); //true, false
enable1Flags(bold: true); //true, null
enable2Flags(bold: false); //false, false
// 可忽略参数函数调用
enable3Flags(true, false); //true, false
enable3Flags(true,); //true, null
enable4Flags(true); //true, false
enable4Flags(true,true); // true, true
4、Dart 中并没有 public、protected、private 这些关键字,我们只要在声明变量与方法时,在前面加上“”即可作为 private 方法使用。如果不加“”,则默认为 public。不过,“_”的限制范围并不是类访问级别的,而是库访问级别。
5、构造函数不能继承,所以超类的命名构造函数 也不会被继承。如果你希望 子类也有超类一样的命名构造函数, 你必须在子类中自己实现该构造函数。
class Point {
num x, y;
// 语法糖,等同于在函数体内:this.x = x;this.y = y;
Point(this.x,this.y);
6、调用超类构造函数
(1、默认情况下,子类的构造函数会自动调用超类的 无名无参数的默认构造函数,
(2、若提供了初始化参数列表,则初始化参数列表在超类构造函数执行之前执行。
(3、构造函数执行顺序:a、initializer list(初始化参数列表)b、superclass’s no-arg constructor(超类的无名构造函数)c、main class’s no-arg constructor(主类的无名构造函数)
(4、如果超类没有无命名无参数构造函数, 则你需要手工的调用超类的其他构造函数。 在构造函数参数后使用冒号 (:) 可以调用 超类构造函数。
7、::联级运算符
xxx
::x = 1
::y = 2
::z = 3;
等同于xxx.x = 1, xxx.y = 2,xxx.z = 3;
8、可以在构造函数体运行之前初始化实例变量,用逗号分隔初始化。
有参构造的初始化:
class Test1 {
var x, y;
Test1(var x, var y)
: x = x,
y = y {
print('Test1 有参构造初始化');
}
}
命名构造的初始化:
class Test2{
var x,y;
Test2.from(Map<String, num> json)
: x = json['x'],
y = json['y'] {
print('Test2.from(): ($x, $y)');
}
}
9、MiXin(混合)使用With关键字实现接口,即扩展类。参考
10、运算符
?.例如p?.name 如果p为null则跳过
??=例如 a ??= value 如果a为null则将value复制给a
??例如a??b如果a不为null则返回a,否则返回b
11、构造函数中参数是声明时定义的用this,如果是继承来的则不用this
12、Dart是单线程语言跟js一样,没有多线程操作。可以通过isolate,每个isolate相当于一个独立的dart运行环境。