flutter系列--Dart語法

1. 重要概念

  1. 能夠放在變量中的所有內(nèi)容都是對象,每個對象都是一個類的實例糊肠。甚至于數(shù)字辨宠、函數(shù)和null值都是對象,并且所有對象都繼承自O(shè)bject類货裹。
  2. Dart是強類型語言嗤形,但類型標識是可選的,因為Dart可以推斷類型弧圆。如果要明確說明不需要任何類型赋兵,可以使用特殊類型dynamic標識。
  3. Dart支持泛型搔预,如List或List(任何類型的對象列表)毡惜。
  4. Dart支持頂級函數(shù)(例如main函數(shù)),以及綁定到類或?qū)ο蟮暮瘮?shù)(分別是靜態(tài)方法和實例方法)斯撮。函數(shù)內(nèi)部也可以創(chuàng)建函數(shù)(嵌套函數(shù)或本地函數(shù))经伙。
  5. Dart支持頂級變量,以及綁定到類或?qū)ο蟮淖兞浚ǚ謩e是靜態(tài)變量和實例變量)勿锅。
  6. 與Java不同帕膜,Dart沒有關(guān)鍵字public、protected和private溢十。如想設(shè)置私有變量或函數(shù)垮刹,則變量和函數(shù)名以下劃線(_)開頭。
  7. 標識符可以以字母或下劃線(_)開頭张弛,后跟這些字符加數(shù)字的任意組合荒典。
  8. Dart有兩個表達式(具有運行時值)和語句(不具有)酪劫。 例如,條件表達式條件寺董? expr1:expr2的值為expr1或expr2覆糟。 將其與if-else語句進行比較,該語句沒有任何值遮咖。 語句通常包含一個或多個表達式滩字,但表達式不能直接包含語句。
  9. Dart工具可以報告兩種問題:警告和錯誤御吞。警告只是表明您的代碼可能無法正常工作麦箍,但它們不會阻止您的程序執(zhí)行。 錯誤可以是編譯時或運行時陶珠。 編譯時錯誤會阻止代碼執(zhí)行; 運行時錯誤導致代碼執(zhí)行時引發(fā)異常挟裂。
  10. 關(guān)鍵字
    任何語言都有關(guān)鍵字,關(guān)鍵字是在編程時不能使用作為標識符的單詞揍诽。Dart的關(guān)鍵字如下
123.png

編碼時應(yīng)避免使用以上單詞作為標識符话瞧,如果有必要,可以使用帶有上標的單詞作為標識符:

  • 帶有上標1的單詞是上下文關(guān)鍵字寝姿,僅在特定位置有含義交排,它們在任何地方都是有效的;
  • 帶有上標2的單詞是內(nèi)置標識符饵筑,它們在大多數(shù)地方是有效的埃篓,但不能用作為類和類型名稱或作為一個導入前綴;
  • 帶有上標3的單詞是與Dart1.0發(fā)布后添加的異步支持相關(guān)的有限的保留字符根资,不能在任何標記為async架专,async * 或sync * 的任何函數(shù)體中使用await和yield作為標識符。

3變量

3.1 變量的定義

1.可以使用var來定義變量玄帕,變量的類型可以通過變量值推斷出來

var name = "hi"; //String類型
var age = 18; //int類型
var high = 1.70; //double類型

如上變量定義后其類型已經(jīng)確定部脚,不可再將其他類型的值賦給變量
2.也可以使用特定類型來定義變量

String name = "bruce"; //String類型
int age = 18; //int類型

3.如果變量不限于單個類型,則可以使用dynamic或Object來定義變量

dynamic value = 18;
print("value = $value");
value = "bruce";
print("value = $value");
value = 3.5;
print("value = $value");
  
Object val = 18;
print("val = $val");
val = "bruce";
print("val = $val");
val = 3.5;
print("val = $val");

輸出結(jié)果為

value = 18
value = bruce
value = 3.5
val = 18
val = bruce
val = 3.5

3.2 變量的默認值

能夠放在變量中的所有內(nèi)容都是對象裤纹,所以如果一個變量沒有初始化值委刘,那它的默認值就為null

int value1;
print("value1 = $value1");
bool value2;
print("value2 = $value2");
var value3;
print("value3 = $value3");
dynamic value4;
print("value4 = $value4");

輸出結(jié)果為

value1 = null
value2 = null
value3 = null
value4 = null

3.3 final 和 const

如果不打算更改變量鹰椒,可以使用final或者const锡移。一個final變量只能被設(shè)置一次,而const變量是編譯時常量漆际,定義時必須賦值淆珊。

// Person類
class Person {
  static const desc = "This is a Person class"; //必須定義時賦值,否則編譯時報錯
  final name;
  Person(this.name); //對象初始化時賦值一次
}

// 定義一個Person對象
Person p = Person("Bruce"); //創(chuàng)建對象時設(shè)置一次name
print("p.name = ${p.name}"); //可正常輸出 p.name = Bruce
p.name = "haha"; //編譯器報錯

4 內(nèi)置類型

Dart語言支持以下類型

  • numbers

包含int和double兩種類型奸汇,沒有像Java中的float類型施符,int和double都是num的子類型

  • strings

Dart的字符串是一系列UTF-16代碼單元往声。創(chuàng)建方法如下:

String str1 = "hello"; //可以使用單引號或雙引號
print("str1 = $str1");
String str2 = """Hi,Bruce
This is Xiaoming.
"""; //使用帶有單引號或雙引號的三重引號可以創(chuàng)建多行字符串
print("str2 = $str2");

輸出結(jié)果為

str1 = hello
str2 = Hi,Bruce
  This is Xiaoming.
  • booleans

Dart有一個名為bool的類型,只有兩個對象具有bool類型:true和false戳吝,他們都是編譯時常量浩销。

  • lists

和其他編程語言常見的集合一樣,Dart中使用的集合是數(shù)組或有序的對象組骨坑。Dart中數(shù)組是List對象撼嗓。

List arr = ["Bruce", "Nick", "John"];
print("arr = $arr");
  • maps
Map map = {
"name": "Bruce",
"age": 18,
"high": 1.70
};

print("map = $map");
print("map['name'] = ${map['name']}");

var map1 = {
1: "hi",
2: "hello",
3: "yep"
};
print("map1 = $map1");
print("map1[1] = ${map1[1]}");

輸出結(jié)果為

map = {name: Bruce, age: 18, high: 1.7}
map['name'] = Bruce
map1 = {1: hi, 2: hello, 3: yep}
map1[1] = hi
  • runes

符文是字符串的UTF-32代碼點柬采。在字符串中表示32位Unicode值需要特殊語法欢唾,常用方法是 \uXXXX,其中XXXX是4位十六進制值粉捻,比如小心心(?)是\u2665礁遣。要指定多于或少于4個十六進制數(shù)字,請將值放在大括號中肩刃。 比如祟霍,微笑(??)是\u{1f600}。

String smile = '\u{1f600}';
print("微笑:$smile");

Runes input = new Runes(
  '\u2665  \u{1f605}  \u{1f60e}  \u{1f47b}  \u{1f596}  \u{1f44d}');
print(String.fromCharCodes(input));

輸出結(jié)果為

微笑:??
?  ??  ??  ??  ??  ??

5 函數(shù)

Dart是一種真正的面向?qū)ο笳Z言盈包,因此即使是函數(shù)也是對象并且具有類型Function沸呐。這意味著函數(shù)可以分配給變量或作為參數(shù)傳遞給其他函數(shù)。

5.1 定義方法

和絕大多數(shù)編程語言一樣呢燥,Dart函數(shù)通常的定義方式為

String getName() {
  return "Bruce";
}

如果函數(shù)體中只包含一個表達式崭添,則可以使用簡寫語法

String getName() => "Bruce";

5.2 可選參數(shù)

Dart函數(shù)可以設(shè)置可選參數(shù),可以使用命名參數(shù)也可以使用位置參數(shù)叛氨。

5.2.1 命名參數(shù)

命名參數(shù)呼渣,定義格式如 {param1, param2, …}

// 函數(shù)定義
void showDesc({var name, var age}) {
  if(name != null) {
    print("name = $name");
  }
  if(age != null) {
    print("age = $age");
  }
}

// 函數(shù)調(diào)用
showDesc(name: "Bruce");

// 輸出結(jié)果
name = Bruce

5.2.2 位置參數(shù)

位置參數(shù),使用 [] 來標記可選參數(shù)寞埠。

// 函數(shù)定義
void showDesc(var name, [var age]) {
  print("name = $name");
  
  if(age != null) {
    print("age = $age");
  }
}

// 函數(shù)調(diào)用
showDesc("Bruce");

// 輸出結(jié)果
name = Bruce

5.2.3 默認值

函數(shù)的可選參數(shù)也可以使用 = 設(shè)置默認值

// 函數(shù)定義
void showDesc(var name, [var age = 18]) {
  print("name = $name");
  
  if(age != null) {
    print("age = $age");
  }
}

// 函數(shù)調(diào)用
showDesc("Bruce");

// 輸出結(jié)果
name = Bruce
age = 18

5.3 main函數(shù)

和其他編程語言一樣屁置,Dart中每個應(yīng)用程序都必須有一個頂級main()函數(shù),該函數(shù)作為應(yīng)用程序的入口點仁连。

5.4 函數(shù)作為參數(shù)

Dart中的函數(shù)可以作為另一個函數(shù)的參數(shù)蓝角。

// 函數(shù)定義
void println(String name) {
  print("name = $name");
}

void showDesc(var name, Function log) {
  log(name);
}

// 函數(shù)調(diào)用
showDesc("Bruce", println);

// 輸出結(jié)果
name = Bruce

5.5 匿名函數(shù)

// 函數(shù)定義
void showDesc(var name, Function log) {
  log(name);
}

// 函數(shù)調(diào)用,匿名函數(shù)作為參數(shù)
showDesc("Bruce", (name) {
    print("name = $name");
  });

// 輸出結(jié)果
name = Bruce

5.6 嵌套函數(shù)

Dart支持嵌套函數(shù)饭冬,也就是函數(shù)中可以定義函數(shù)帅容。

// 函數(shù)定義
void showDesc(var name) {
  print("That is a nested function!");
  
  //函數(shù)中定義函數(shù)
  void println(var name) {
    print("name = $name");
  }
  
  println(name);
}

// 函數(shù)調(diào)用
showDesc("Bruce");

// 輸出結(jié)果
That is a nested function!
name = Bruce

6 運算符

Dart中使用到的運算符如下表格


Dart中使用到的運算符.png

6.1 ?.的使用

//定義類
class Person {
  var name;
  Person(this.name);
}

// 調(diào)用
Person p;
var name = p?.name; //先判斷p是否為null,如果是伍伤,則name為null并徘;如果否,則返回p.name值
print("name = $name");

// 輸出結(jié)果
name = null

6.2 ~/的使用

// 代碼語句
var num = 10;
var result = num ~/ 3; //得出一個小于等于(num/3)的最大整數(shù)
print("result = $result");

// 輸出結(jié)果
result = 3

6.3 as的使用扰魂,as用來做類型轉(zhuǎn)化

// 類定義
class Banana {
  var weight;
  Banana(this.weight);
}

class Apple {
  var weight;
  Apple(this.weight);
}

// 調(diào)用
dynamic b = Banana(20);
(b as Banana).weight = 20; // 正常執(zhí)行
print("b.weight = ${(b as Banana).weight}");
(b as Apple).weight = 30; // 類型轉(zhuǎn)換錯誤麦乞,運行報錯
print("b.weight = ${(b as   Apple).weight}");

//輸出結(jié)果
b.weight = 20
Uncaught exception:
CastError: Instance of 'Banana': type 'Banana' is not a subtype of type 'Apple'

6.3 is的使用

// 函數(shù)和類代碼定義
getFruit() => Banana(20); // 獲取一個水果對象

class Banana {
  var weight;
  Banana(this.weight);
}

class Apple {
  var color;
  Apple(this.color);
}

// 調(diào)用
var b = getFruit();
if(b is Apple) { //判斷對象是否為Apple類
  print("The fruit is an apple");
} else if(b is Banana) { //判斷水果是否為Banana類
  print("The fruit is a banana");
}

// 輸出結(jié)果
The fruit is a banana

6.4 ??的使用

// 操作代碼塊
String name;
String nickName = name ?? "Nick"; //如果name不為null蕴茴,則nickName值為name的值,否則值為Nick
print("nickName = $nickName");
  
name = "Bruce";
nickName = name ?? "Nick"; //如果name不為null姐直,則nickName值為name的值倦淀,否則值為Nick
print("nickName = $nickName");
  
// 輸出結(jié)果
nickName = Nick
nickName = Bruce 

6.5 ..的使用,級聯(lián)操作允許對同一個對象進行一系列操作声畏。

// 類定義
class Banana {
  var weight;
  var color;
  Banana(this.weight, this.color);
  
  void showWeight() {
    print("weight = $weight");
  }
  
  void showColor() {
    print("color = $color");
  }
}

// 調(diào)用
Banana(20, 'yellow')
    ..showWeight()
    ..showColor();
    
// 輸出結(jié)果
weight = 20
color = yellow

7 控制流語句

Dart中的控制流語句和其他語言一樣撞叽,包含以下方式

  • if and else
  • for循環(huán)
  • while和do-while循環(huán)
  • break和continue
  • switch-case語句

以上控制流語句和其他編程語言用法一樣,switch-case有一個特殊的用法如下插龄,可以使用continue語句和標簽來執(zhí)行指定case語句愿棋。

var fruit = 'apple';
switch (fruit) {
  case 'banana':
    print("this is a banana");
    continue anotherFruit;
      
  anotherFruit:
  case 'apple':
    print("this is an apple");
    break;
}

// 輸出結(jié)果
this is an apple

8 異常

Dart的異常捕獲也是使用try-catch語法,不過與java等語言稍有不同

// 定義一個拋出異常的函數(shù)
void handleOperator() => throw Exception("this operator exception!");

// 函數(shù)調(diào)用
try {
  handleOperator();
} on Exception catch(e) {
  print(e);
} finally { // finally語句可選
  print("finally");
}

// 輸出結(jié)果
Exception: this operator exception!
finally

9 類

Dart是一種面向?qū)ο蟮恼Z言均牢,具有類和基于mixin的繼承糠雨。同Java一樣,Dart的所有類也都繼承自O(shè)bject徘跪。

9.1 構(gòu)造函數(shù)

Dart的構(gòu)造函數(shù)同普通函數(shù)一樣甘邀,可以定義無參和有參,命名參數(shù)和位置參數(shù)垮庐,可選參數(shù)和給可選參數(shù)設(shè)置默認值等松邪。Dart的構(gòu)造函數(shù)有以下幾個特點:

  1. 可以定義命名構(gòu)造函數(shù)
  2. 可以在函數(shù)體運行之前初始化實例變量
  3. 子類不從父類繼承構(gòu)造函數(shù),定義沒有構(gòu)造函數(shù)的子類只有無參無名稱的構(gòu)造函數(shù)
  4. 子類定義構(gòu)造函數(shù)時默認繼承父類無參構(gòu)造函數(shù)哨查,也可繼承指定有參數(shù)的構(gòu)造函數(shù)逗抑;

命名構(gòu)造函數(shù)和函數(shù)體運行前初始化實例變量

// 類定義
class Tree {
  var desc;
  
  // 命名構(gòu)造函數(shù)
  Tree.init() {
    desc = "this is a seed";
  }
  
  // 函數(shù)體運行之前初始化實例變量
  Tree(var des) : desc = des;
}

// 構(gòu)造函數(shù)調(diào)用
Tree t = Tree.init();
print("${t.desc}");

Tree t1 = Tree("this is a tree");
print("${t1.desc}");

// 輸出結(jié)果
this is a seed
this is a tree

構(gòu)造函數(shù)繼承

// 類定義
class Fruit {
  Fruit() {
    print("this is Fruit constructor with no param");
  }
  
  Fruit.desc(var desc) {
    print("$desc in Fruit");
  }
}

class Apple extends Fruit {
  Apple():super() {
    print("this is Apple constructor with no param");
  }
  
  // 默認繼承無參構(gòu)造函數(shù)
  Apple.desc(var desc) {
    print('$desc in Apple');
  }
}

// 構(gòu)造函數(shù)調(diào)用
Apple();
Apple.desc("say hello");
  
// 輸出結(jié)果
this is Fruit constructor with no param
this is Apple constructor with no param
this is Fruit constructor with no param
say hello in Apple

9.2 mixin繼承

mixin是一種在多個類層次結(jié)構(gòu)中重用類代碼的方法。

// 類定義
class LogUtil {
  void log() {
    print("this is a log");
  }
}

class Fruit {
  Fruit() {
    print("this is Fruit constructor with no param");
  }
}

class Apple extends Fruit with LogUtil {
  Apple():super() {
    print("this is Apple constructor with no param");
  }
}

// 調(diào)用
Apple a = Apple();
a.log(); //可執(zhí)行從LogUtil繼承過來的方法

// 輸出結(jié)果
this is Fruit constructor with no param
this is Apple constructor with no param
this is a log

10 泛型

Dart同Java一樣解恰,也支持泛型锋八。

// 類定義
class Apple {
  var desc;
  Apple(this.desc);
  
  void log() {
    print("${this.desc}");
  }
}

class Banana {
  var desc;
  Banana(this.desc);
  
  void log() {
    print("${this.desc}");
  }
}

class FruitFactory<T> {
  T produceFruit(T t) {
    return t;
  }
}

// 調(diào)用
FruitFactory<Banana> f = FruitFactory<Banana>();
Banana b = f.produceFruit(Banana("a banana"));
b.log();
  
FruitFactory<Apple> f1 = FruitFactory<Apple>();
Apple a = f1.produceFruit(Apple("an apple"));
a.log();
  
// 輸出結(jié)果
a banana
an apple 

參考

一文了解Dart語法

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市护盈,隨后出現(xiàn)的幾起案子挟纱,更是在濱河造成了極大的恐慌,老刑警劉巖腐宋,帶你破解...
    沈念sama閱讀 207,113評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件紊服,死亡現(xiàn)場離奇詭異,居然都是意外死亡胸竞,警方通過查閱死者的電腦和手機欺嗤,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,644評論 2 381
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來卫枝,“玉大人煎饼,你說我怎么就攤上這事⌒3啵” “怎么了吆玖?”我有些...
    開封第一講書人閱讀 153,340評論 0 344
  • 文/不壞的土叔 我叫張陵筒溃,是天一觀的道長。 經(jīng)常有香客問我沾乘,道長怜奖,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,449評論 1 279
  • 正文 為了忘掉前任翅阵,我火速辦了婚禮歪玲,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘掷匠。我一直安慰自己滥崩,他們只是感情好,可當我...
    茶點故事閱讀 64,445評論 5 374
  • 文/花漫 我一把揭開白布槐雾。 她就那樣靜靜地躺著夭委,像睡著了一般幅狮。 火紅的嫁衣襯著肌膚如雪募强。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,166評論 1 284
  • 那天崇摄,我揣著相機與錄音擎值,去河邊找鬼。 笑死逐抑,一個胖子當著我的面吹牛鸠儿,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播厕氨,決...
    沈念sama閱讀 38,442評論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼进每,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了命斧?” 一聲冷哼從身側(cè)響起田晚,我...
    開封第一講書人閱讀 37,105評論 0 261
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎国葬,沒想到半個月后贤徒,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,601評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡汇四,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,066評論 2 325
  • 正文 我和宋清朗相戀三年接奈,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片通孽。...
    茶點故事閱讀 38,161評論 1 334
  • 序言:一個原本活蹦亂跳的男人離奇死亡序宦,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出背苦,到底是詐尸還是另有隱情互捌,我是刑警寧澤堡僻,帶...
    沈念sama閱讀 33,792評論 4 323
  • 正文 年R本政府宣布,位于F島的核電站疫剃,受9級特大地震影響钉疫,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜巢价,卻給世界環(huán)境...
    茶點故事閱讀 39,351評論 3 307
  • 文/蒙蒙 一牲阁、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧壤躲,春花似錦城菊、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,352評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至漏麦,卻和暖如春客税,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背撕贞。 一陣腳步聲響...
    開封第一講書人閱讀 31,584評論 1 261
  • 我被黑心中介騙來泰國打工更耻, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人捏膨。 一個月前我還...
    沈念sama閱讀 45,618評論 2 355
  • 正文 我出身青樓秧均,卻偏偏與公主長得像,于是被迫代替她去往敵國和親号涯。 傳聞我的和親對象是個殘疾皇子目胡,可洞房花燭夜當晚...
    茶點故事閱讀 42,916評論 2 344

推薦閱讀更多精彩內(nèi)容