目錄介紹
-
01.變量聲明
- 1.1 var聲明變量
- 1.2 變量和常量
- 1.3 dynamic和Object
-
02.數據類型
- 2.1 基本數據類型
- 2.2 String字符串
- 2.3 List數組
- 2.4 Map集合
-
03.Dart函數和運算符
- 3.1 Dart函數介紹
- 3.2 命名參數
- 3.3 參數默認值
- 3.4 void無返回值
- 3.5 匿名函數
- 3.6 運算符介紹
-
04.Dart流程控制
- 4.1 流程控制語句
- 4.2 if和else
- 4.3 for循環
- 4.4 while循環
- 4.5 break和continue
- 4.6 switch和case
- 4.7 assert斷言
-
05.Dart面向對象
- 5.1 類簡單介紹
- 5.2 構造函數
- 5.3 繼承類
- 5.4 重載和重寫
- 5.5 抽象類
- 5.6 訪問權限
- 5.7 靜態方法
- 5.8 泛型
-
06.Dart異步解讀
-
6.1 Future簡單介紹
- 6.1.1 普通異步案例
- 6.1.2 耗時異步案例
- 6.2 async/await介紹
- 6.3 看一個案例
-
-
07.Dart異常捕獲
- 7.1 異常處理形式
- 7.2 拋出異常
- 7.3 捕獲異常
- 7.4 Finally講解
-
08.Dart枚舉
- 8.1 枚舉使用
- 8.2 元數據
- 8.3 自定義註解
-
09.Dart字符串
- 9.1 String簡單介紹
- 9.2 單雙引號互相嵌套
- 9.3 字符串拼接方式
想換個工作,渴望同行內推我
-
個人信息
- 姓名:楊充【26歲】
- 郵箱:[email protected]
- 微信:13667225184
- GitHub:https://github.com/yangchong211
- 博客彙總:https://github.com/yangchong2...
- 幹活集中營:Android端技術博客和開源項目審覈員
- 目前工作情況:在職狀態
- 技術項目和博客:GitHub項目7k以上star,follower1.1k以上,發表博客100多篇。
- 熱愛技術:開源項目和博客多次被鴻洋,郭霖,Android技術週刊,幹活集中營等等推薦。
- 學歷:武漢軟件工程職業學院,大專學歷
- 工作年限:3年多
- 工作地點:北京
-
關於近期投遞簡歷一點感想
- 從進入Android這個行業以來,前兩次幾乎都是朋友內推,面試機會相對容易,都是一個App一個人做或者兩個人做,用戶相對來說並不多。這次想着離職,主要是想進入一個較大的平臺,大概可以理解爲Android端有個至少四五人,可以進行技術交流,渴望自己能夠在技術上突破,這就像自己平時獨自跑步,和跟着一羣跑馬拉松的人跑步,那種緊張感肯定是不一樣的。
- 近段時間,嘗試着向一些較大的公司投遞簡歷,大概在拉鉤上投了15個左右(不喜歡海投),發現絕大多數簡歷到不了技術那裏,就被人事說學歷不夠,經驗不夠,工作不匹配等情況回絕。不過也可以理解,看簡歷無非就是學歷和經驗,貌似自己的履歷是差了一點。
- 這大概是第一次在網上發一個主動希望同行內推的介紹,如果你的公司有Android方面的招聘,能否內推一下我這個小人物,感謝。
01.變量聲明
1.1 var聲明變量
-
類似於kotlin中的
var
,它可以接收任何類型的變量,但最大的不同是Dart中var變量一旦賦值,類型便會確定,則不能再改變其類型,如:var t; t="yc"; // 下面代碼在dart中會報錯,因爲變量t的類型已經確定爲String, // 類型一旦確定後則不能再更改其類型。 t=1000;
- 最大的不同是Dart中var變量一旦賦值,類型便會確定,則不能再改變其類型。因爲Dart本身是一個強類型語言,任何變量都是有確定類型的,在Dart中,當用var聲明一個變量後,Dart在編譯時會根據第一次賦值數據的類型來推斷其類型,編譯結束後其類型就已經被確定。
- 思考一下,dart在編譯時是如何確定數據的類型呢?
1.2 變量和常量
1.2.1 變量
-
變量如下所示
var curPage = 0; var title = "瀟湘劍雨:小楊逗比";
- Dart 不需要給變量設置 setter getter 方法, 這和 kotlin 等類似。Dart 中所有的基礎類型、類等都繼承 Object ,默認值是 NULL, 自帶 getter 和 setter ,而如果是 final 或者 const 的話,那麼它只有一個 getter 方法。
1.2.2 常量
-
const 的值在編譯期確定,final 的值要到編譯時才確定。
-
Dart 中 final 表示常量
//final 表示常量 final title = "瀟湘劍雨:小楊逗比";
-
static const 組合代表了靜態常量
//static const 組合代表了靜態常量 static const String complete = "COMPLETE";
-
-
final和const區別
- 兩者區別在於:
const
變量是一個編譯時常量,final
變量在第一次使用時被初始化。被final
或者const
修飾的變量,並且變量類型可以省略。
- 兩者區別在於:
-
注意點
- const變量同時也是final變量,實例變量可以爲final但不能是const。
- 編譯錯報錯,原因final變量只能賦值一次!
//定義初始化一個變量 final double number = 13.14; number = 520; //調用打印數字方法 printNumber(number);
1.2.3 注意+
-
在Java中可以直接通過 + 號將字符串和int類型拼接,但是在Dart中是不行的。
//在Java中,下面操作可行 ToastUtils.showRoundRectToast("二維碼掃描"+1000); //在dart中,下面錯誤操作,編譯不通過,直接會有紅色提示 int yc = 0; print("瀟湘劍雨" + yc); //在dart中,下面正確操作 int yc = 0; print("瀟湘劍雨" + yc.toString());
1.3 dynamic和Object
Object
是dart所有對象的根基類,也就是說所有類型都是Object
的子類(包括Function和Null),所以任何類型的數據都可以賦值給Object
聲明的對象.-
-
dynamic
與var
一樣都是關鍵詞,聲明的變量可以賦值任意對象.而dynamic
與Object
相同之處在於,他們聲明的變量可以在後期改變賦值類型.
dynamic t; Object x; t = "hi world"; x = 'Hello Object'; //下面代碼沒有問題 t = 1000; x = 1000;
-
-
dynamic
與Object
不同的是,dynamic
聲明的對象編譯器會提供所有可能的組合,而Object
聲明的對象只能使用Object的屬性與方法, 否則編譯器會報錯. 如:
dynamic a;
Object b;
main() {
a = "";
b = "";
printLengths();
}
printLengths() {
// no warning
print(a.length);
// warning:
// The getter 'length' is not defined for the class 'Object'
print(b.length);
}
-
變量a不會報錯, 變量b編譯器會報錯
-
dynamic
的這個特性與Objective-C
中的id
作用很像. -
dynamic
的這個特點使得我們在使用它是需要格外注意,這很容易引入一個運行時錯誤.
-
02.數據類型
2.1 基本數據類型
-
var 可以定義變量,同時 Dart 屬於動態類型語言,支持閉包。
- Dart 中 number 類型分爲 int 和 double ,其中 java 中的 long 對應的也是 Dart 中的 int 類型。Dart 中沒有 float 類型。
//int類型 這裏沒有long類型 var positionIndex = 0; //double類型 這裏沒有float類型 var time = 1993.03;
- 這裏提個小建議,聲明變量的時候,可以選擇加上具體類型。添加類型可以更加清晰表達你的意圖。
//定義初始化一個變量 double number = 13.14;
-
Dart 下只有 bool 型可以用於 if 等判斷,不同於 JS 這種使用方式是不合法的 var g = "null"; if(g){} 。
- 以bool代表布爾值,只有兩個對象是布爾類型的,那就是true和false所創建的對象,這兩個對象都是編譯時常量。
//類似Java中的布爾類型 bool mIsLogin = false; if (!mIsLogin) { //沒有登陸 print('沒有登陸'); } else { //已經登陸 Navigator.of(context).push(new MaterialPageRoute(builder: (context) { return new CollectPage(); })); }
- 注意,下面這種情況會報錯
String name ="yc"; //報錯 因爲name不是bool類型 if(name){ print(name); }
- 可以使用的是先式的檢查值。assert是語言內置的斷言的函數,僅在檢查模式有效,在開發過程中,除非條件爲真,否則會引發異常。(斷言失敗則程序立刻終止)
// 檢查是否爲空字符串 var fullName = 'doubi'; assert(fullName.isEmpty); // 檢查是否小於等於0 var hitPoints = 0; assert(hitPoints <= 0); // 檢查是否爲 null. var unicorn; assert(unicorn == null); // 檢查是否爲 NaN. var iMeantToDoThis = 0 / 0; assert(iMeantToDoThis.isNaN);
2.2 String字符串
-
Dart 中,switch 支持 String 類型。後面會單獨拿出來講解一下。
//字符串 var title = "瀟湘劍雨:小楊逗比";
2.3 List數組
-
聲明一個list非常的簡單,可以簡單使用方括號[]定義list。下面是list的常用操作。
main(List<String> args) { //或者 List arr1 = [1,2,3,4]; var arr2 = [1,2,3,4]; print(list); //Output: [1, 2, 3, 4] //Length 長度 print(list.length); //Selecting single value 獲取單個值 print(list[1]); //Outout: 2 //Adding a value 添加值到list list.add(10); //Removing a single isntance of value 刪除單個值 list.remove(3); //Remove at a particular position 刪除指定位置的值 list.removeAt(0); }
- 注意:第一個元素索引是0,最後一個元素是length-1
-
如果你想定義一個編譯時常量list,例如,list的內容是不可改變的,可以使用關鍵字const
var list = const [1,2,3,4];
2.4 Map集合
-
定義map也很簡單。可以使用花括號{}定義map。
void test() { var map = { 'key1': 'value1', 'key2': 'value2', 'key3': 'value3' }; //Fetching the values 獲取值 print(map['key1']); //Output: value1 print(map['test']); //Output: null //Add a new value 添加值 map['key4'] = 'value4'; //Length 獲取長度 print(map.length); //Check if a key is present 檢查是否存在 var containsKey = map.containsKey('value1'); print(containsKey); var entries = map.entries; var values = map.values; }
- 打印日誌
2019-06-20 17:22:39.200 4281-4329/com.hwmc.auth I/flutter: value1 2019-06-20 17:22:39.200 4281-4329/com.hwmc.auth I/flutter: null 2019-06-20 17:22:39.200 4281-4329/com.hwmc.auth I/flutter: 4 2019-06-20 17:22:39.200 4281-4329/com.hwmc.auth I/flutter: false
-
也可以使用map構造函數定義map。
- 可以發現map可以存儲多種類型的數據
var squares = new Map(); squares["a"] = 1; squares["b"] = 2; squares["c"] = 3.0; squares["d"] = [1,2]; squares["e"] = "yc逗比"; print(squares['a']); print(squares['e']);
- 打印日誌
2019-06-20 17:27:32.841 4281-4329/com.hwmc.auth I/flutter: 1 2019-06-20 17:27:32.841 4281-4329/com.hwmc.auth I/flutter: yc逗比
03.Dart函數和運算符
3.1 Dart函數介紹
-
dart中的函數和JavaScript中有點類似。你需要定義就是函數的名字、返回值(有返回值或者void)、參數。
void test(){ var name = fullName('楊充', '逗比'); print(name); } String fullName(String firstName, String lastName) { return "$firstName $lastName"; }
3.2 命名參數
-
dart有個叫命名參數的東西。當你調用函數的時候,你必須指定參數的名字。要使用命名參數,可以將函數的參數包括在花括號{}內。
- 如果你在調用命名參數的函數時,沒有指定參數的名字,則會提示紅色報錯,無法通過編譯。
void test(){ var name = fullName('楊充', '逗比'); print(name); } String fullName(String firstName, String lastName) { return "$firstName $lastName"; }
3.3 參數默認值
-
你可以給函數的命名參數一個默認值。下面的例子給lastName一個默認值。
void test(){ var name = fullName('楊充', '逗比'); print(name); } fullName(String firstName, String lastName) { return "$firstName $lastName"; }
3.4 void無返回值
- 大多數都是void無返回值的函數,這個跟java中類似。沒什麼好講的……
3.5 匿名函數
-
在dart中函數比較靈活,例如,你可以將函數當參數傳遞給另一個函數。
void test(){ out(printOutLoud); } out(void inner(String message)) { inner('Message from inner function'); } printOutLoud(String message) { print(message.toUpperCase()); }
- 這裏定義一個函數名字爲out,需要一個函數參數。然後我定義一個名爲printOutLoud的函數,他所做的就是將字符串以大寫的形式打印。
- dart 也有匿名函數,所以上面的例子中不用預定一個函數,而是傳遞一個匿名函數。
另一個匿名函數的例子。
3.6 運算符介紹
- 這部分和java差不多,可以直接看我java部分的博客:運算符
04.Dart流程控制
4.1 Dart流程控制
-
大概有這麼多
- if和else
- for循環
- while循環
- break和continue
- switch和case
- assert斷言
4.2 if和else
-
if-else 和其他語言一樣比較簡單。
var number = 57; if (number > 100) { print('Large Number'); } else if (number < 100) { print('Small Number'); } else { print('Number is 100'); }
-
可以用三元運算符代替if-else
int age = 60; String status = age < 50 ? "年輕人" : "老年人";
4.3 for循環
-
for循環和java幾乎是一樣的,代碼如下
void test() { for (int i = 0; i < 10; i++) { print('$i'); } }
4.4 while循環
-
while循環如下所示
void test() { int i = 0; while(i < 10) { print('$i'); i++; } }
-
The classic for do while loop. 典型的do while循環。
void test() { int i = 0; do { print('$i'); i++; } while (i < 10); }
4.6 break和continue
4.7 switch和case
-
代碼如下所示
void test() { int age = 50; switch(age) { case 10: print('Too Young.'); break; case 20: case 30: print('Still Young!'); break; case 40: print('Getting old.'); break; case 50: print('You are old!'); break; } }
05.Dart面向對象
5.1 類簡單介紹
-
創建一個類和創建類的實例
void test1(){ Dog d = new Dog(); } class Dog { } var cat = new Cat("逗比", 12); class Cat { String name; int age; Cat(String name, int age) { this.name = name; this.age = age; } }
5.2 構造函數
-
普通構造函數
var cat = new Cat("逗比", 12); class Cat { String name; int age; Cat(String name, int age) { this.name = name; this.age = age; } }
-
命名構造函數
- 給構造函數提供了名稱,這樣做使得不同的構造函數變的更加清晰。
Map map = new Map(); map['name']= "哈巴狗"; map['age'] = 5; Dog d = new Dog.newBorn(map); class Dog { String name; int age; Dog(this.name, this.age); Dog.newBorn(Map json) { name = json['name']; age = json['age']; } }
5.3 繼承類
-
可以使用extends關鍵字繼承其他的類。
- Pug 類繼承Dog類,通過super關鍵字調用Dog類的構造函數。
Pug p = new Pug('逗比哈巴狗', 5); print(p.name); class Dog { String name; int age; Dog(this.name, this.age); Dog.newBorn() { name = 'Doggy'; age = 0; } } class Pug extends Dog { Pug(String name, int age): super(name, age); }
-
也可以通過this關鍵字,在冒號之後調用同一個類中的其他構造函數。
- 定義了兩個命名構造函數,他們只需要dog的名字,然後調用Pug的默認構造函數。
Pug p = new Pug.small('傻逼'); print(p.name); class Dog { String name; int age; Dog(this.name, this.age); Dog.newBorn() { name = '逗比哈巴狗'; age = 0; } } class Pug extends Dog { Pug(String name, int age): super(name, age); Pug.small(String name): this(name, 1); Pug.large(String name): this(name, 3); }
5.4 重載和重寫
-
方法重寫
- 代碼如下,最後打印值是:你真是個逗比
Pug p = new Pug(); print(p.bark()); class Dog { bark() { print('Bow Wow'); } } class Pug extends Dog { @override bark() { print('你真是個逗比!'); } }
方法重載
5.5 抽象類
-
可以通過abstract關鍵字聲明抽象類
- 只需要在類聲明前添加abstract關鍵字,方法不需要。方法只需要簽名,不需要實現。
abstract class AbstractDog { void eat(); void _hiddenMethod(); } class SmallDog extends AbstractDog{ @override void _hiddenMethod() { } @override void eat() { } }
5.6 訪問權限
-
默認類中的所有屬性和方法是public的。在dart中,可以在屬性和方法名前添加“_”使私有化。現在讓我們使name屬性私有化。
- 可以發現,調用私有化變量或者方法的時候會出現紅色警告
void test() { Dog d = new Dog('哈巴狗', 5); //這個報錯 print(d.name); print(d.age); }
- Dog代碼如下所示
class Dog { String _name; int age; Dog(this._name, this.age); String get respectedName { return 'Mr.$_name'; } set respectedName(String newName) { _name = newName; } Dog.newBorn() { _name = '哈巴狗'; age = 0; } bark() { print('Bow Wow'); } _hiddenMethod() { print('I can only be called internally!'); } }
5.7 靜態方法
-
如果想讓方法或者屬性靜態化,只需要在聲明前添加static關鍵字。
void test() { Dog.bark(); } class Dog { static bark() { print('Bow Wow'); } }
5.8 泛型
-
dart全面支持泛型。假設你想在你定義的類中,想持有任意類型的數據。如下是怎樣使用泛型定義這樣的類。
DataHolder<String> dataHolder = new DataHolder('Some data'); print(dataHolder.getData()); dataHolder.setData('New Data'); print(dataHolder.getData()); //下面這個會報錯,因爲dataHolder對象在創建的時候就已經限制爲String類型 dataHolder.setData(123); print(dataHolder.getData()); class DataHolder<T> { T data; DataHolder(this.data); getData() { return data; } setData(data) { this.data = data; } }
06.Dart異步解讀
6.1 Future簡單介紹
-
async 庫中有一個叫Future的東西。Future是基於觀察者模式的。如果你熟悉Rx或者JavaScript的Promises,你就很容易明白了。
- 首先先看一下下面的案例,看看它們之間有什麼區別?
void testA() async{ new Future<String>(() { return "This is a doubi"; }); } Future testB() async{ return new Future<String>(() { return "This is a doubi"; }); } Future<String> testC() { return new Future<String>(() { return "This is a doubi"; }); }
6.1.1 普通異步案例
-
Future是支持泛型的,例如Future,通過T指定將來返回值的類型。
- 定義了一個叫getTest的函數,返回值爲Future<String>.你可以通過new關鍵字創建一個Future。Future的構造函數,需要一個函數作爲參數,這個函數返回T類型的數據。在匿名函數中的返回值就是Future的返回值。
- 當調用了getTest方法,他返回Future<String>.我們通過調用then方法訂閱Future,在then中註冊回調函數,當Future返回值時調用註冊函數。同時註冊了catchError方法處理在Future執行之間發生的異常。這個例子中不會發生異常。
void test() { getTest().then((value) { print("測試----------"+value); }).catchError((error) { print('測試----------Error'); }); } Future<String> getTest() { return new Future<String>(() { return "This is a doubi"; }); } //打印結果 2019-06-21 17:11:12.941 16501-16583/com.hwmc.auth I/flutter: 測試----------This is a doubi
- 下面這個案例會發生異常
void test() { getTest().then((value) { print("測試----------"+value); }).catchError((error) { print('測試----------Error'); }); } Future<String> getTest() { return new Future<String>(() { return "This is a doubi"; }); } //打印結果 2019-06-21 17:18:46.896 16501-16583/com.hwmc.auth I/flutter: 測試----------Error
6.1.2 耗時異步案例
-
在生產環境中都是一些耗時的操作,例如,網絡調用,我們可以使用Future.delayed()模仿。
- 現在如果你運行,你將需要2秒,才能返回結果。
void test() { getTest().then((value) { print("測試----------"+value); }).catchError((error) { print('測試----------Error'); }); } Future<String> getTest() { return new Future<String>.delayed(new Duration(milliseconds: 2000),() { return "This is a doubi"; }); }
- 接下來再看一個案例。在調用函數之後,我們添加了print語句。在這種場景中,print語句會先執行,之後future的返回值纔會打印。這是future的預期行爲.但是如果我們希望在執行其他語句之前,先執行future。
void test() { getTest().then((value) { print("測試----------"+value); }).catchError((error) { print('測試----------Error'); }); print('測試----------逗比是這個先執行嗎'); } Future<String> getTest() { return new Future<String>.delayed(new Duration(milliseconds: 2000),() { return "This is a doubi"; }); } 2019-06-21 17:26:16.619 16501-16583/com.hwmc.auth I/flutter: 測試----------逗比是這個先執行嗎 2019-06-21 17:26:17.176 16501-16583/com.hwmc.auth I/flutter: 測試----------This is a doubi
6.2 async/await介紹
-
思考一下,看了上面的案例,對於future的預期行爲,如果我們希望在執行其他語句之前,先執行future,該怎麼操作呢?
- 這就需要用到需要用到async/await。在test函數的花括號開始添加async關鍵字。我們添加await關鍵字在調用getTest方法之前,他所做的就是在future返回值之後,繼續往下執行。我們將整個代碼包裹在try-catch中,我們想捕獲所有的異常,和之前使用catchError回調是一樣。使用awiat關鍵字,必須給函數添加async關鍵字,否則沒有效果。
- 注意:要使用 await,其方法必須帶有 async 關鍵字。可以使用 try, catch, 和 finally 來處理使用 await 的異常!
Future test() async { try { String value = await getTest(); print("測試----------"+value); } catch(e) { print('測試----------Error'); } print('測試----------逗比是這個先執行嗎'); } Future<String> getTest() { return new Future<String>.delayed(new Duration(milliseconds: 2000),() { return "This is a doubi"; }); } 2019-06-21 17:32:37.701 16501-16583/com.hwmc.auth I/flutter: 測試----------This is a doubi 2019-06-21 17:32:37.702 16501-16583/com.hwmc.auth I/flutter: 測試----------逗比是這個先執行嗎
6.3 看一個案例
-
一個 async 方法 是函數體被標記爲 async 的方法。 雖然異步方法的執行可能需要一定時間,但是 異步方法立刻返回 - 在方法體還沒執行之前就返回了。
void getHttp async { // TODO --- }
-
在一個方法上添加 async 關鍵字,則這個方法返回值爲 Future。
- 例如,下面是一個返回字符串的同步方法:
String loadAppVersion() => "1.0.2"
-
使用 async 關鍵字,則該方法返回一個 Future,並且 認爲該函數是一個耗時的操作。
Futre<String> loadAppVersion() async => "1.0.2"
- 注意,方法的函數體並不需要使用 Future API。 Dart 會自動在需要的時候創建 Future 對象。
-
-
好的代碼是這樣的
void main() { //調用異步方法 doAsync(); } // 在函數上聲明瞭 async 表明這是一個異步方法 Future<bool> doAsync() async { try { // 這裏是一個模擬請求一個網絡耗時操作 var result = await getHttp(); //請求出來的結果 return printResult(result); } catch (e) { print(e); return false; } } //將請求出來的結果打印出來 Future<bool> printResult(summary) { print(summary); } //開始模擬網絡請求 等待 5 秒返回一個字符串 getHttp() { return new Future.delayed(Duration(seconds: 5), () => "Request Succeeded"); }
-
不好的寫法
void main() { doAsync(); } Future<String> doAsync() async { return getHttp().then((r){ return printResult(r); }).catchError((e){ print(e); }); } Future<String> printResult(summary) { print(summary); } Future<String> getHttp() { return new Future.delayed(Duration(seconds: 5), () => "Request Succeeded"); }
07.Dart異常捕獲
7.1 異常處理形式
- dart 使用經典的try-catch處理異常,使用關鍵字throw拋出一個異常。
7.2 拋出異常
-
看看如何拋出異常
void test1(){ divide(10, 0); } divide(int a, int b) { if (b == 0) { throw new IntegerDivisionByZeroException(); } return a / b; }
- 當b變量的值爲0的時候,拋出一個內置的異常IntegerDivisionByZeroException。
-
如何定義異常日誌呢?
- 可以在異常中攜帶一個字符串信息。
void test1(){ divide(10, 0); } divide(int a, int b) { if (b == 0) { throw new Exception('逗比,不能爲0的'); } return a / b; }
7.3 捕獲異常
-
某種類型的異常可以通過on關鍵字捕獲,如下:
void test1(){ try { divide(10, 0); } on IntegerDivisionByZeroException { print('逗比,異常被捕獲了'); } } divide(int a, int b) { if (b == 0) { throw new IntegerDivisionByZeroException(); } return a / b; }
-
注意問題,捕獲的異常層級要大於拋出的異常,否則捕獲會失敗
- 還是會拋出異常'逗比,不能爲0的',因爲Exception比IntegerDivisionByZeroException層級要高。
void test1(){ try { divide(10, 0); } on IntegerDivisionByZeroException { print('逗比,異常被捕獲了'); } } divide(int a, int b) { if (b == 0) { throw new Exception('逗比,不能爲0的'); } return a / b; }
-
如果你不知道拋出異常的類型,或者不確定,可以使用catch塊處理任意類型的異常。
void test1(){ try { divide(10, 0); } on IntegerDivisionByZeroException { print('逗比,異常被捕獲了'); } catch (e) { print(e); } } divide(int a, int b) { if (b == 0) { throw new Exception('yc other exception.'); } return a / b; }
7.4 Finally講解
-
dart也提供了finally塊,即是否發生異常這個塊都會執行。
void test1(){ try { divide(10, 0); } on IntegerDivisionByZeroException { print('逗比,異常被捕獲了'); } catch (e) { print(e); }finally { print('I will always be executed!'); } } divide(int a, int b) { if (b == 0) { throw new Exception('yc other exception.'); } return a / b; }
08.Dart枚舉
8.1 枚舉使用
-
dart 支持枚舉,用法和java一樣。
Dog d = new Dog('哈巴狗', 12, CurrentState.sleeping); print(d.state == CurrentState.sleeping); //Prints 'true' enum CurrentState { sleeping, barking, eating, walking } class Dog { String name; int age; CurrentState state; Dog(this.name, this.age, this.state); static bark() { print('Bow Wow'); } }
8.2 元數據
- 使用元數據給代碼添加額外信息,元數據註解是以@字符開頭,後面是一個編譯時常量或者調用一個常量構造函數。
- 有三個註解所有的Dart代碼都可使用:@deprecated、@override,@proxy,下面直接上@deprecated的示例:
- 元數據可以在library、typedef、type parameter、constructor、factory、function、field、parameter、或者variable聲明之前使用,也可以在import或者export指令之前使用,使用反射可以再運行時獲取元數據信息。
8.3 自定義註解
-
定義自己的元數據註解。下面的示例定義一個帶有兩個參數的@toDo註解:
void test1() { doSomething(); } @toDo('seth', 'make this do something') void doSomething() { print('do something'); } class toDo { final String who; final String what; const toDo(this.who, this.what); }
09.Dart字符串
9.1 String簡單介紹
-
Dart字符串是UTF-16編碼的字符序列,可以使用單引號或者雙引號來創建字符串:
String str1 = '單引號字符串'; String str2 = "雙引號字符串"; print(str1); //輸出:單引號字符串 print(str2); //輸出:雙引號字符串
9.2 單雙引號互相嵌套
-
String中單、雙引號互相嵌套情況如下所示
String str1 = '單引號中的"雙引號"字符串'; String str2 = "雙引號中的'單引號'字符串"; print("yc-str1--" + str1); print("yc-str2--" + str2); //單引號裏面有單引號,必須在前面加反斜槓 String str3 = '單引號中的\'單引號\''; String str4 = "雙引號裏面有雙引號,\"雙引號\""; print("yc-str3--" + str3); print("yc-str4--" + str4);
- 打印值
2019-06-21 17:52:07.722 16501-16583/com.hwmc.auth I/flutter: yc-str1--單引號中的"雙引號"字符串 2019-06-21 17:52:07.723 16501-16583/com.hwmc.auth I/flutter: yc-str2--雙引號中的'單引號'字符串 2019-06-21 17:52:07.723 16501-16583/com.hwmc.auth I/flutter: yc-str3--單引號中的'單引號' 2019-06-21 17:52:07.723 16501-16583/com.hwmc.auth I/flutter: yc-str4--雙引號裏面有雙引號,"雙引號"
-
注意點::
- 單引號嵌套單引號之間不允許出現空串(不是空格),雙引號嵌套雙引號之間不允許出現空串:
//String str5 = '單引號''''單引號'; //報錯了,逗比 String str6 = '單引號'' ''單引號'; String str7 = '單引號''*''單引號'; String str8 = "雙引號"" ""雙引號"; String str9 = "雙引號""*""雙引號"; //String str10 = "雙引號""""雙引號"; //報錯了,逗比 print("yc-str6--" + str6); print("yc-str7--" + str7); print("yc-str8--" + str8); print("yc-str9--" + str9);
-
打印值
2019-06-21 17:56:21.847 16501-16583/com.hwmc.auth I/flutter: yc-str6--單引號 單引號 2019-06-21 17:56:21.847 16501-16583/com.hwmc.auth I/flutter: yc-str7--單引號*單引號 2019-06-21 17:56:21.847 16501-16583/com.hwmc.auth I/flutter: yc-str8--雙引號 雙引號 2019-06-21 17:56:21.847 16501-16583/com.hwmc.auth I/flutter: yc-str9--雙引號*雙引號
其他介紹
01.關於博客彙總鏈接
02.關於我的博客
- github:https://github.com/yangchong211
- 知乎:https://www.zhihu.com/people/...
- 簡書:http://www.jianshu.com/u/b7b2...
- csdn:http://my.csdn.net/m0_37700275
- 喜馬拉雅聽書:http://www.ximalaya.com/zhubo...
- 開源中國:https://my.oschina.net/zbj161...
- 泡在網上的日子:http://www.jcodecraeer.com/me...
- 郵箱:[email protected]
- 阿里雲博客:https://yq.aliyun.com/users/a... 239.headeruserinfo.3.dT4bcV
- segmentfault頭條:https://segmentfault.com/u/xi...
- 掘金:https://juejin.im/user/593943...