接上篇Dart入門教程1http://www.reibang.com/p/8b566a653cc3
參考:https://codelabs.flutter-io.cn/codelabs/from-java-to-dart/#0
1.使用可選參數(shù)
有時候我們的構(gòu)造函數(shù)有很多參數(shù)目锭,每次調(diào)用構(gòu)造函數(shù)時候评汰,有些參數(shù)我們希望可以不必傳入,就使用默認值就好了痢虹,不然會很繁瑣被去,dart當然也提供可選參數(shù)的寫法
//Bicycle(this.cadence, this.gear);
Bicycle({this.cadence=0, this.gear=1});//記得外面補上大括號"{}""
我們調(diào)用時候,可以這樣調(diào)用奖唯,但需要把key(參數(shù)名稱)補上惨缆,這里跟c#有點區(qū)別:
void main() {
print(Bicycle());
print(Bicycle(cadence:10));
print(Bicycle(gear:10));
print(Bicycle(cadence:10,gear:10));
}
2.創(chuàng)建工廠模式
工廠模式在java里是一個常見的設(shè)計模式,與直接對象實例化相比(new一個對象)有幾個有點,例如是隱藏/封裝實例化的詳情坯墨,提供返回可繼承子類的功能寂汇,返回一個已經(jīng)存在的實例(有些實例是可以重復(fù),沒有必要每次都new一個)等等捣染。
這節(jié)我們會用一個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關(guān)鍵字上次忘了介紹耍攘,跟var一樣修飾變量差不多榕栏,只不多final修飾的是常量,賦值了不能變蕾各,var則可以變
我們運行一下臼膏,應(yīng)該可以看到輸出如下:
12.566370614359172
4
2.1.方法1:創(chuàng)建一個top-leave的方法
我們可以在空白的地方加上(不要在class里)創(chuàng)建一個方法工廠,這個跟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);
}
//創(chuàng)建一個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:創(chuàng)建一個factory的構(gòu)造函數(shù)
dart有一個factory的構(gòu)造函數(shù)可以提供給我們創(chuàng)建工廠示损,現(xiàn)在我們在抽象類里渗磅,加一個factory構(gòu)造函數(shù)并調(diào)用:
import 'dart:math';
abstract class Shape {
num get area;
//添加一個factory構(gòu)造函數(shù)
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');//調(diào)用就是直接調(diào)用抽象函數(shù),跟平時一樣
final square = Shape('square');
print(circle.area);
print(square.area);
}
3.實現(xiàn)接口
dart沒有interface關(guān)鍵字检访,因為所有的class默認都是interface始鱼,我們來實現(xiàn)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);
}
//實現(xiàn)接口
class CircleMock implements Circle {
num area;//沒有這些會報錯,這是實現(xiàn)接口的約定
num radius;
}
main() {
final circle = Shape('circle');
final square = Shape('square');
print(circle.area);
print(square.area);
}
4.使用dart的函數(shù)編程(functional programming)
例如脆贵,我們循環(huán)打印一些東西:
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.小結(jié)
至此教程結(jié)束会烙。
dart還是比較簡單易學(xué)的一門語言,另外還有更多的內(nèi)置函數(shù)例如隨機數(shù)等等筒捺,這些用的時候搜一下很容易搜出來柏腻,還有async/await這些,跟其他語言差不多系吭,這里我不一一介紹了五嫂。