var和Object和dynamic区别
var在没初始值时可以变成任意类型,有初始值后就固定为对应的类型。
Object可以是任意类型,编译时会进行静态检查,对应不上会导致编译失败。
dynamic可以是任意类型,编译时不会进行静态检查,如果对应不上,能编译通过,运行时会crash。
??和??=和?.
a = b ?? "hello"; // 如果b不为null,就赋值给a,否则赋值hello给a
a ??="hello"; // 如果a为null,就赋值hellp给a
print(a?.hashCode); // 如果a为null,就不调用,打印null,否则调用hashCode
级联调用
两个点表示级联调用,可以让代码更简洁,对成员变量,成员方法都可以用。
void main() {
Cat()
..eat()
..sleep()
..name = '胖橘'
..speak();
}
class Cat {
String? name;
void speak() {
print('my name:' + (name??''));
}
void eat() {
print('eat');
}
void sleep() {
print('sleep');
}
}
mixin和with和on
mixin可以理解为公共的代码块,一个类可以with多个代码块,然后直接调用。
void main() {
Cat()
..eat()
..sleep();
}
mixin Eat {
eat() {
print('eat');
}
}
mixin Sleep {
sleep() {
print('sleep');
}
}
class Cat with Eat, Sleep {
}
mixin可以搭配on使用,实现类代码组合:
void main() {
Mac().init();
}
abstract class Computer {
void init() {
print('computer init');
}
}
mixin CPU on Computer {
void init() {
super.init();
print('CPU init');
}
}
mixin Disk on Computer {
void init() {
super.init();
print('Disk init');
}
}
class Mac extends Computer with CPU, Disk {
}
Flutter中的WidgetsFlutterBinding就是采用该方式实现的。