01.變量聲明php
02.數據類型java
03.Dart函數和運算符git
04.Dart流程控制github
05.Dart面向對象面試
06.Dart異步解讀json
6.1 Future簡單介紹segmentfault
07.Dart異常捕獲數組
08.Dart枚舉微信
09.Dart字符串網絡
我的信息
關於近期投遞簡歷一點感想
相似於kotlin中的var
,它能夠接收任何類型的變量,但最大的不一樣是Dart中var變量一旦賦值,類型便會肯定,則不能再改變其類型,如:
var t; t="yc"; // 下面代碼在dart中會報錯,由於變量t的類型已經肯定爲String, // 類型一旦肯定後則不能再更改其類型。 t=1000;
變量以下所示
var curPage = 0; var title = "瀟湘劍雨:小楊逗比";
const 的值在編譯期肯定,final 的值要到編譯時才肯定。
Dart 中 final 表示常量
//final 表示常量 final title = "瀟湘劍雨:小楊逗比";
static const 組合表明了靜態常量
//static const 組合表明了靜態常量 static const String complete = "COMPLETE";
final和const區別
const
變量是一個編譯時常量,final
變量在第一次使用時被初始化。被final
或者const
修飾的變量,而且變量類型能夠省略。注意點
//定義初始化一個變量 final double number = 13.14; number = 520; //調用打印數字方法 printNumber(number);
在Java中能夠直接經過 + 號將字符串和int類型拼接,可是在Dart中是不行的。
//在Java中,下面操做可行 ToastUtils.showRoundRectToast("二維碼掃描"+1000); //在dart中,下面錯誤操做,編譯不經過,直接會有紅色提示 int yc = 0; print("瀟湘劍雨" + yc); //在dart中,下面正確操做 int yc = 0; print("瀟湘劍雨" + yc.toString());
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
的這個特色使得咱們在使用它是須要格外注意,這很容易引入一個運行時錯誤.var 能夠定義變量,同時 Dart 屬於動態類型語言,支持閉包。
//int類型 這裏沒有long類型 var positionIndex = 0; //double類型 這裏沒有float類型 var time = 1993.03;
//定義初始化一個變量 double number = 13.14;
Dart 下只有 bool 型能夠用於 if 等判斷,不一樣於 JS 這種使用方式是不合法的 var g = "null"; if(g){} 。
//相似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); }
// 檢查是否爲空字符串 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);
Dart 中,switch 支持 String 類型。後面會單獨拿出來說解一下。
//字符串 var title = "瀟湘劍雨:小楊逗比";
聲明一個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); }
若是你想定義一個編譯時常量list,例如,list的內容是不可改變的,可使用關鍵字const
var list = const [1,2,3,4];
定義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。
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逗比
dart中的函數和JavaScript中有點相似。你須要定義就是函數的名字、返回值(有返回值或者void)、參數。
void test(){ var name = fullName('楊充', '逗比'); print(name); } String fullName(String firstName, String lastName) { return "$firstName $lastName"; }
dart有個叫命名參數的東西。當你調用函數的時候,你必須指定參數的名字。要使用命名參數,能夠將函數的參數包括在花括號{}內。
void test(){ var name = fullName('楊充', '逗比'); print(name); } String fullName(String firstName, String lastName) { return "$firstName $lastName"; }
你能夠給函數的命名參數一個默認值。下面的例子給lastName一個默認值。
void test(){ var name = fullName('楊充', '逗比'); print(name); } fullName(String firstName, String lastName) { return "$firstName $lastName"; }
在dart中函數比較靈活,例如,你能夠將函數當參數傳遞給另外一個函數。
void test(){ out(printOutLoud); } out(void inner(String message)) { inner('Message from inner function'); } printOutLoud(String message) { print(message.toUpperCase()); }
另外一個匿名函數的例子。
大概有這麼多
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 ? "年輕人" : "老年人";
for循環和java幾乎是同樣的,代碼以下
void test() { for (int i = 0; i < 10; i++) { print('$i'); } }
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); }
代碼以下所示
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; } }
建立一個類和建立類的實例
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; } }
普通構造函數
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']; } }
可使用extends關鍵字繼承其餘的類。
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關鍵字,在冒號以後調用同一個類中的其餘構造函數。
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); }
方法重寫
Pug p = new Pug(); print(p.bark()); class Dog { bark() { print('Bow Wow'); } } class Pug extends Dog { @override bark() { print('你真是個逗比!'); } }
方法重載
能夠經過abstract關鍵字聲明抽象類
abstract class AbstractDog { void eat(); void _hiddenMethod(); } class SmallDog extends AbstractDog{ @override void _hiddenMethod() { } @override void eat() { } }
默認類中的全部屬性和方法是public的。在dart中,能夠在屬性和方法名前添加「_」使私有化。如今讓咱們使name屬性私有化。
void test() { Dog d = new Dog('哈巴狗', 5); //這個報錯 print(d.name); print(d.age); }
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!'); } }
若是想讓方法或者屬性靜態化,只須要在聲明前添加static關鍵字。
void test() { Dog.bark(); } class Dog { static bark() { print('Bow Wow'); } }
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; } }
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"; }); }
Future是支持泛型的,例如Future,經過T指定未來返回值的類型。
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
在生產環境中都是一些耗時的操做,例如,網絡調用,咱們可使用Future.delayed()模仿。
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"; }); }
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
思考一下,看了上面的案例,對於future的預期行爲,若是咱們但願在執行其餘語句以前,先執行future,該怎麼操做呢?
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: 測試----------逗比是這個先執行嗎
一個 async 方法 是函數體被標記爲 async 的方法。 雖然異步方法的執行可能須要必定時間,可是 異步方法馬上返回 - 在方法體還沒執行以前就返回了。
void getHttp async { // TODO --- }
在一個方法上添加 async 關鍵字,則這個方法返回值爲 Future。
String loadAppVersion() => "1.0.2"
使用 async 關鍵字,則該方法返回一個 Future,而且 認爲該函數是一個耗時的操做。
Futre<String> loadAppVersion() async => "1.0.2"
好的代碼是這樣的
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"); }
看看如何拋出異常
void test1(){ divide(10, 0); } divide(int a, int b) { if (b == 0) { throw new IntegerDivisionByZeroException(); } return a / b; }
如何定義異常日誌呢?
void test1(){ divide(10, 0); } divide(int a, int b) { if (b == 0) { throw new Exception('逗比,不能爲0的'); } return a / b; }
某種類型的異常能夠經過on關鍵字捕獲,以下:
void test1(){ try { divide(10, 0); } on IntegerDivisionByZeroException { print('逗比,異常被捕獲了'); } } divide(int a, int b) { if (b == 0) { throw new IntegerDivisionByZeroException(); } return a / b; }
注意問題,捕獲的異常層級要大於拋出的異常,不然捕獲會失敗
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; }
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; }
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'); } }
定義本身的元數據註解。下面的示例定義一個帶有兩個參數的@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); }
Dart字符串是UTF-16編碼的字符序列,可使用單引號或者雙引號來建立字符串:
String str1 = '單引號字符串'; String str2 = "雙引號字符串"; print(str1); //輸出:單引號字符串 print(str2); //輸出:雙引號字符串
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--雙引號*雙引號