接上篇Dart入門教程1http://www.lxweimin.com/p/8b566a653cc3
參考:https://codelabs.flutter-io.cn/codelabs/from-java-to-dart/#0
1.使用可選參數
有時候我們的構造函數有很多參數,每次調用構造函數時候,有些參數我們希望可以不必傳入,就使用默認值就好了,不然會很繁瑣,dart當然也提供可選參數的寫法
//Bicycle(this.cadence, this.gear);
Bicycle({this.cadence=0, this.gear=1});//記得外面補上大括號"{}""
我們調用時候,可以這樣調用,但需要把key(參數名稱)補上,這里跟c#有點區別:
void main() {
print(Bicycle());
print(Bicycle(cadence:10));
print(Bicycle(gear:10));
print(Bicycle(cadence:10,gear:10));
}
2.創建工廠模式
工廠模式在java里是一個常見的設計模式,與直接對象實例化相比(new一個對象)有幾個有點,例如是隱藏/封裝實例化的詳情,提供返回可繼承子類的功能,返回一個已經存在的實例(有些實例是可以重復,沒有必要每次都new一個)等等。
這節我們會用一個shape的例子去示范,這個程序會算出圖形面積并打印:
import 'dart:math';//這是dart的一個核心類庫(自帶的)
abstract class Shape {
num get area;
}
class Circle implements Shape {
final num radius;
Circle(this.radius);
num get area => pi * pow(radius, 2);//pi和pow都是上面import的東西
}
class Square implements Shape {
final num side;
Square(this.side);
num get area => pow(side, 2);
}
main() {
final circle = Circle(2);//圓形
final square = Square(2);//正方形
print(circle.area);
print(square.area);
}
final關鍵字上次忘了介紹,跟var一樣修飾變量差不多,只不多final修飾的是常量,賦值了不能變,var則可以變
我們運行一下,應該可以看到輸出如下:
12.566370614359172
4
2.1.方法1:創建一個top-leave的方法
我們可以在空白的地方加上(不要在class里)創建一個方法工廠,這個跟javascript有點類似:
import 'dart:math';
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);
}
//創建一個top-leave方法
Shape shapeFactory(String type) {
if (type == 'circle') return Circle(3);
if (type == 'square') return Square(2);
throw 'Can\'t create $type.';
}
main() {
final circle = shapeFactory('circle');
final square = shapeFactory('square');
print(circle.area);
print(square.area);
}
2.2.方法2:創建一個factory的構造函數
dart有一個factory的構造函數可以提供給我們創建工廠,現在我們在抽象類里,加一個factory構造函數并調用:
import 'dart:math';
abstract class Shape {
num get area;
//添加一個factory構造函數
factory Shape(String type) {
if (type == 'circle') return Circle(2);
if (type == 'square') return Square(2);
throw 'Can\'t create $type.';
}
}
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);
}
3.實現接口
dart沒有interface關鍵字,因為所有的class默認都是interface,我們來實現Circle 來測試一下
import 'dart:math';
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);
}
//實現接口
class CircleMock implements Circle {
num area;//沒有這些會報錯,這是實現接口的約定
num radius;
}
main() {
final circle = Shape('circle');
final square = Shape('square');
print(circle.area);
print(square.area);
}
4.使用dart的函數編程(functional programming)
例如,我們循環打印一些東西:
String scream(int length) => "A${'a' * length}h!";
main() {
final values = [1, 2, 3, 5, 10, 50];
for (var length in values) {
print(scream(length));
}
}
我們可以看到輸出:
Aah!
Aaah!
Aaaah!
Aaaaaah!
Aaaaaaaaaaah!
Aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaah!
上面for的這塊代碼,我們也可以寫成這樣(我喜歡一行過,簡單樸實):
// for (var length in values) {
// print(scream(length));
// }
values.map(scream).forEach(print);
然后我們跳過第一個item,取第一個item之后的3個item
// for (var length in values) {
// print(scream(length));
// }
values.skip(1).take(3).map(scream).forEach(print);
輸出如下:
Aaah!
Aaaah!
Aaaaaah!
5.小結
至此教程結束。
dart還是比較簡單易學的一門語言,另外還有更多的內置函數例如隨機數等等,這些用的時候搜一下很容易搜出來,還有async/await這些,跟其他語言差不多,這里我不一一介紹了。