1、final和const使用场景
const适用于编译期就能确定的字面值常量。
final适用于需要在运行期才能确定值的常量,且赋值后不能再改变值。
只看文字描述可能不好理解,通过下面的例子就会很清楚了,下面的例子如果把final改为const会编译不通过的。
var x = 100;
var y = 200;
final double xdy = x/y; // x/y的值在运行期才能确定,因此不能使用const
2、任何保存在变量中的都是对象 ,所有对象继承自 Object 类,并且所有的对象都是对应一个类 的实例。
无论是数字,函数和 null
都是对象。
所有未初始化的变量的初始化都是null
例如int型的变量,如果定义时未初始化,则为null
3、??和?. 运算符
有以下2种使用场景,可以简写很多代码
b ??= value // 如果b为空时,将变量赋值给b,否则,b的值保持不变。
expr1 ?? expr2
//如果 expr1 是 non-null, 返回 expr1 的值; 否则, 执行并返回 expr2 的值。
4、?. 运算符
foo?.bar
如果foo变量为null值,则整个表达式的值为null。否则表达式的值为foo对象的bar属性的值。
5、..
语法为 级联调用 (cascade)
使用级联调用, 可以简化在一个对象上执行的多个操作。
class Point {
int x;
int y;
Point(this.x, this.y);
}
void main() {
Point p1 = Point(100, 100);
p1
..x = 200
..y = 200; // 注意分号加在最后一个语句的末尾,中间的语句不能加分号。
}
6、没有关键字 "public","protected"和"private"。 如果标识符以下划线(_)开头,则它相对于库是私有的。
7、=> expr
=> expr
语法是 { return expr; }
的简写。 =>
符号 有时也被称为 箭头 语法。
如果函数中只有一句表达式,可以使用这种简写语法:
bool isNoble(int atomicNumber) => _nobleGases[atomicNumber] != null;
8、混入
通过创建一个继承自 Object 且没有构造函数的类,来实现 一个 Mixin 。 如果 Mixin 不希望作为常规类被使用,使用关键字 mixin
替换 class
。
也就是说,如果你写了一个类,他没有继承其它类(所有类默认继承Object),而且也没有自定义构造函数,那么它就可以作为一个Mixin来使用。
9、接口实现(implements)
如果有一个类 A,你想让类B拥有A的API,但又不想继承A的实现,那么可以把A当做接口:类B implements 类A.
每个类都隐式的定义了一个接口,接口包含了该类所有的实例成员及其实现的接口(构造函数不包含在接口里)。
接口里面的方法和成员变量都需要在子类里重新实现,你可以在子类重新实现时加上@override,用于和新增的成员区分。
参考:https://www.dartcn.com/guides/language/language-tour#%E9%9A%90%E5%BC%8F%E6%8E%A5%E5%8F%A3
https://www.cnblogs.com/webcabana/p/11872265.html