Dart语法笔记
Dart所有东西都是对象,继承自Object类
Dart关键字不存在interface,类和接口都是用class表示。用implements表示继承和实现。
没有初始化的变量都赋值为null。
final的值只能被设定一次。const 是一个编译时的常量。
实例变量可以为 final 但是不能是 const 。如果 const 变量在类中,请定义为 static const。
通过提供一个 r 前缀可以创建一个 “原始 raw” 字符串:
var s = r"In a raw string, even \n isn't special.";
当 Dart 需要一个布尔值的时候,只有 true 对象才被认为是 true。 所有其他的值都是 flase。这点和 JavaScript 不一样, 像 1、 “aString”、 以及 someObject 等值都被认为是 false。
var name = 'Bob';
if (name) {
// 在js中会打印 dart中则不会
print('You have a name!');
}
定义一个不变的list对象(编译时常量):
var constantList = const [1,2,3];
定义一个编译时常量map集合
final constantMap = const{
2:'helium',
10:'neon',
18:'argon',
};
定义方法时,使用可选参数,这不等于Java中的重载
分为可选命名参数和可选位置参数
可选命名参数定义形式 {参数一,参数二,…}
Rectangle({this.origin = const Point(0, 0), this.width = 0, this.height = 0});
可选位置参数定义形式用[]表示
String say(String from, String msg, [String device]) {
var result = '$from says $msg';
if (device != null) {
result = '$result with a $device';
}
return result;
}
操作符
-expr 负号 ~/ 除号,但是返回值是整数
赋值操作
??= 给值为null的变量赋值 如果变量不为null 则变量的值保持不变。
expr1 ?? expr2
如果 expr1 是 non-null,返回其值; 否则执行 expr2 并返回其结果
级联操作符
querySelector('#button') // Get an object.
..text = 'Confirm' // Use its members.
..classes.add('important')
..onClick.listen((e) => window.alert('Confirmed!'));
var button = querySelector('#button');
button.text = 'Confirm';
button.classes.add('important');
button.onClick.listen((e) => window.alert('Confirmed!')); 两种代码等价
Dart类的简化
class Bicycle{
int cadence;
int speed;
int gear;
Bicycle(this.cadence,this.speed,this.gear);
// Bicycle(int cadence, int speed, int gear) {
// this.cadence = cadence;
// this.speed = speed;
// this.gear = gear;
// }
@override
String toString()=>'Bicycle: $speed mph';
}
异步支持
async await 要使用 await,其方法必须带有 async 关键字:
checkVersion() async {
var version = await lookUpVersion();
if (version == expectedVersion) {
// Do something.
} else {
// Do something else.
}
}
在一个方法上添加 async 关键字,则这个方法返回值为 Future。
Dart没有关键字public/private/protected, 上面两个构造函数等价
void main() {
var bicycle = Bicycle(2,0,1);
print(bicycle.cadence.toString());
final bike = Bicycle(3,0,1);
print(bike.cadence.toString());
}
Dart创建对象在Dart2中可以省略。
如果您知道变量的值不会更改,则可以使用final而不是var。
要将Dart标识符标记为私有,使用下划线开始其名称。添加getter 来转换为只读。修改后代码如下
class Bicycle {
int cadence;
int _speed = 0;
int get speed => _speed;
int gear;
Bicycle(this.cadence, this.gear);
void applyBrake(int decrement) {
_speed -= decrement;
}
void speedUp(int increment) {
_speed += increment;
}
@override
String toString() => 'Bicycle: $_speed mph';
}
Dart创建可选参数构造函数
class Rectangle {
int width;
int height;
Point origin;
Rectangle({this.origin = const Point(0, 0), this.width = 0, this.height = 0});
@override
String toString() =>
'Origin: (${origin.x}, ${origin.y}), width: $width, height: $height';
}
main() {
print(Rectangle(origin: const Point(10, 20), width: 100, height: 200));
print(Rectangle(origin: const Point(10, 10)));
print(Rectangle(width: 200));
print(Rectangle());
}
Dart创建工厂
abstract class Shape {
factory Shape(String type) {
if (type == 'circle') return Circle(2);
if (type == 'square') return Square(2);
throw 'Can\'t create $type.';
}
num get area;
}
class Circle implements Shape {
final num radius;
Circle(this.radius);
num get area => pi * pow(radius, 2);
}
class Square implements Shape {
final num side;
Square(this.side);
num get area => pow(side, 2);
}
main() {
final circle = Shape("circle");
final square = Shape("square");
print(circle.area);
print(square.area);
}