本文主要介紹Dart開發經常使用的一些語法git
Const 變量在編譯時就已經固定。
Final 變量或類變量在第一次使用時被初始化,懶加載。
Const不能定義對象 Final能定義對象github
例:閉包
//能夠省略String這個類型聲明 final str = "hi world"; //final String str = "hi world"; const str1 = "hi world"; //const String str1 = "hi world";
String str =""" 保留換行的字符串 能夠在編譯器裏換行 """; String str2 =''' 保留換行的字符串 能夠在編譯器裏換行 '''; print(str); print(str2);
double num1 = 1.0; double num2= 1; print(num1.runtimeType); print("----"); print(num2.runtimeType);
Map testMap = {}; testMap["flag"] = true; print(testMap["flag"]);
var promoActive = true; var nav = [ 'Home', 'Furniture', 'Plants', if (promoActive) 'Outlet' ]; print(nav);
在List類型中使用For語句ide
var listOfInts = [1, 2, 3]; var listOfStrings = [ '#0', for (var i in listOfInts) '#$i' ]; print(listOfStrings);
int num = 1; print(num is String); String str = "測試"; print(str is String);
double num = 5; print( num ~/ 2); //5除2取整
String str1 = "str1"; String str2 = "str2"; print("$str1 $str2");
String str = "三目運算符"; print(str == "三目運算符"?"我是true":"我是false" );
int num = 1; double doubleNum =1.0; String str = "1"; print(int.parse(str).runtimeType); print(num.toString().runtimeType); print(doubleNum.toInt().runtimeType);
String str1 = ""; print(str1.isEmpty); String str2 = "1"; print(str2.isEmpty); String str3; //此行代碼會報錯,null不能調用isEmpty print(str3.isEmpty);
String _privateStr = "私有變量"; _privateFunction(){ print("私有方法"); }
import 'dart:math' as math;
String str; //不合法 if(str){ } //合法 if(str != null){ }
List list1 = [1,2,3]; List list2=[-1,0,...list1]; print(list2); List list3; // ...?運算符 若是爲空就不插入 List list4 = [0,...?list3]; print(list4);
級聯運算符 (..) 能夠實現對同一個對像進行一系列的操做。 除了調用函數, 還能夠訪問同一對象上的字段屬性。函數
var button = Button() // 獲取對象。 ..text = 'Confirm' // 調用成員變量。 ..classes.add('important') ..onClick.listen((e) => window.alert('Confirmed!'));
第一句建立對象。獲取的對象依次執行級聯運算符後面的代碼, 代碼執行後的返回值會被忽略。
上面的代碼等價於:佈局
var button = Button(); button.text = 'Confirm'; button.classes.add('important'); button.onClick.listen((e) => window.alert('Confirmed!'));
String str; print(str ?? 1);//若是str爲空 返回1 str ??= "1"; //若是str爲空 將str賦值爲1 print(str); int num = 1; num?.toString();//若是str爲空 不執行toString; print(num.runtimeType); int num1; num1?.toString();//若是str爲空 不執行toString; print(num1.runtimeType == Null);
Dart屬於強類型語言,但能夠用var聲明變量,Dart對於var聲明會自推導出數據類型。實際上var是編譯期的語法糖, 而dynamic聲明才表示動態類型,dynamic被編譯後是一個object類型,在編譯期間不對任何的類型進行檢查,而是在運行時對類型進行檢查。測試
String str = "1"; int num = 1; print(str == num);
String str = "test"; //此行代碼會報錯 str = 1;
對於只包含一個表達式的函數,可使用簡寫語法3d
printFunc(String str)=> print(str) ; //等同於 //printFunc(String str) { // print(str); //}
_test(){ execute(() => print("func被執行了")); execute1(callback); } void execute(var func) { func(); } void execute1(var callback){ callback("callback被執行了"); } callback(str){ print(str); }
定義函數時,使用{param1, param2, …},放在參數列表的最後面,用於指定命名參數。例如:code
//設置[bold]和[hidden]標誌 void enableFlags({bool bold, bool hidden}) { // ... } 調用函數 enableFlags(bold: true, hidden: false);
Dart 的閉包是定義在方法裏面的方法,其特性:
閉包是一個對象
閉包定義在其餘方法內部
閉包能夠訪問外部方法的佈局變量,並持有其狀態。這是閉包的最大用途,經過閉包的方式把一個方法內部的屬性暴露出去,由於方法是能夠返回方法的,Dart 中方法也是對象同樣能夠當作返回值處理對象
sum(){ var num = 0; sum2(){ num++; print(num); } return sum2; // 也能夠這麼寫,匿名的方式用的最多 return (){ num++; print(num); }; } // 多調用閉包幾回 void main(){ Function a = sum(); a(); a(); a(); a(); a(); a(); } ~~~~~~~~~~log~~~~~~~~~~ 1 2 3 4 5 6
能夠理解sum()就是一個對象,在初始化對象時,數值a已經被肯定爲0,再次調用a()時,沒有再次執行var num = 0;,由於沒有從新初始化類,因此賦值操做不會再執行一次。
上文全部的代碼示例都在做者的GiuHub上,https://github.com/jack0-0wu/flutter_demo,裏面還包含了一些經常使用flutter功能的展現。
紙上得來終覺淺,絕知此事要躬行。