This passage may update with timeline.
2019.03.07 Update
1. 基础篇
1⃣️ 初始化
class Bicycle {
int cadence;
int speed;
int gear;
}
void main() {
}
main()
方法是 Dart 的主方法;- 如果你需要访问命令行传递过来的参数,可以使用
main(List<String> args
方法; main()
方法存在于最外层的作用域;- 在 Dart 中,可以在类之外编写代码,变量、方法、存取方法,它们都可以独立于类之外维持生命周期;
- Java 中使用了 pubilc、private、protected 作为声明成员变量可访问性的标记;Dart 中使用
_
标记为变量为私有,通过改变变量名来实现将变量标识为只读; - 无论是
main()
还是其他类都声明为 public ,默认情况下都是 public 的; - Dart 使用了 2 个字符长度作为缩进, Dart 的格式化工具 dartfmt 能够自动调整缩进;
2⃣️ 构造函数
Bicycle(this.cadence, this.speed, this.gear);
- 在 Dart 中,构造函数没有方法体是合法的,与规范方法体是相同功效的;
- 但没有方法体的构造函数后必须书写分号,否则,告诉你"A function body must be provided.";
- 省略方法体使得 Dart 中能够在构造函数的参数中使用 this 直接对实例变量进行赋值,不用再编写多余的代码;
3⃣️ new/final
void main() {
final bike = Bicycle(2, 0, 1);
print(bike);
}
- Dart 2 中,new 变为可选;
- 当某个变量的值确信不不会发生变化时,可将 var 改为 final;
4⃣️ @override
@override
String toString() => 'Bicycle: $speed mph';
Or
@override
RandomWordsState createState() => new RandomWordsState();
@override
表示重写某个方法或某个类,如果该复写不成功,编译器就会报错;- Dart 的许多特性与 Javascript 及 Css 类似,故可以使用单引号或者双引号进行字符串的声明;
- 可以在字符串内使用
${expression}
的方式来实现字符串模板的效果;如果该表达式仅仅是一个标识符,还可以去掉花括号用$variableName
表示; - 针对只有一行的方法可以使用
=>
来简化方法的书写;
5⃣️ 访问方式
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';
}
void main() {
var bike = Bicycle(2, 1);
print(bike);
}
- Dart 中声明的变量的访问方式与Js中对象的属性访问方式(Java中的类 + 变量名)的访问方式类似;
- 通过
int get speed => _speed;
将 speed 作为实例变量;
2. 函数差异
1⃣️ Java
- 支持函数的重载,相同函数名时通过返回值的不同、或参数的不同来进行重载;
- 没有方法体会报错;
2⃣️ JavaScript
- 没有函数重载的概念,因为函数接受的参数是可变的,根据传入的个数来进行对应操作;
- 可以没有方法体,函数接受的参数可以包含任意类型(包括构造方法及函数等);
3⃣️ Dart
- 同JavaScript,不支持重载,但可以通
{ }
根据输入的可选参数,进行相应不同的print;
@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());
}
- 可以没有方法体,函数接受的参数可以包含任意类型(包括构造方法及函数等);
Rectangle({this.origin = const Point(0, 0), this.width = 0, this.height = 0});
this.origin
,this.width
和this.height
直接对类中的实例变量进行赋值;this.origin
,this.width
和this.height
嵌套在闭合的{ }
中,表示可选的命名参数;this.origin = const Point(0, 0)
表明给实例变量origin
赋予了const
静态/默认值Point(0,0)
,const
静态/默认值必须是在编译期就可以确定的常量;
3. 抽象 / 工厂
1⃣️ abstract
Java
abstract class Shape {
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);
}