前言:筆者學過 java,剛剛接觸 flutter,記錄下基本的一些語法。javascript
Flutter 是 google 推出的,使用的 Dart 語言,它能夠跨平臺實現 Android 和 IOS 的移動UI開發。固然,他不止這些特性,可是筆者正是由於這點來學習的。java
Flutter 官網:https://flutter.dev/異步
Dart 官網:http://dart.goodev.org/async
Dart 有一個網頁編輯器,若是你尚未安裝環境,可使用 DartPad 體驗下 dart 的語法編輯器
// 接下來筆者將以實際代碼來展現 dart 的一些基本語法 //首先如今這就是一個完整的 .dart 文件,如同 .java //咱們把他取名爲 firstDart.dart //這裏定義了一個叫作 A 的類 class FirstDart { //下面定義了些可能經常使用的類型屬性 //注意:dart 中全部對象不賦值的狀況下都是 null,null 也是對象 //先看下這兩個動態數據類型,它們能夠賦值任何對象 var vStr = "字符串"; var vInt = 1; dynamic dStr = "字符串"; dynamic dInt = 1; //咱們看下數值。 //num,int,double。num 其實就是包含了 int 和 double num n = 0; int i = 0; double d = 0.0; //dart 中的字符串定義和javascript很相似,很是自由,單雙引號均可以 String str1 = "這是字符串"; String str2 = '這是字符串'; //字符串拼接方式也是不少,簡單瞭解下,須要的時候能夠大膽多嘗試些寫法 String str3 = "這是" + "字符串"; String str4 = "這是" "字符串"; String str5 = "這是" '字符串'; String str6 = """ 這也是 字符串 """; //boolean 類型,這個簡單就很少說了 bool b = true; //集合,詳細的後面再說,這裏簡單展現下List的一些定義 List list1 = new List();//默認長度是0 List<String> list2 = new List<String>(3);//dart中也是有泛型的,初始化集合大小 List list3 = new List()..length = 3;//這其實就是一種鏈式寫法,後面再詳細介紹 List list4 = [1,'2',3.0,true];//直接初始化集合 List<String> list5 = ['1',"2"];//若是前置類型指定了泛型,初始化就必須是指定的類型 //映射,詳細的後面再說,這裏簡單展現下Map的一些定義 Map map1 = new Map(); Map<int,String> map2 = new Map();//Map的泛型 Map map3 = {"key1" : "value1", 1 : 2};//直接初始化Map //函數對象,將代碼塊封裝到這個函數對象中可用於傳遞 //dart 也可使用 Lambda表達式,不過java是 ->,而dart是 => //這個目前發現好像有些和我想的不同,具體的之後再補充,目前發現裏面好像不讓用分號,也就是不讓寫多行代碼 Function fun1 = () => print("這裏是代碼塊"); Function fun2 = (String str) => str.trim().toLowerCase();//能夠函數對象的入參,不過好像沒有檢查,可能會引起啓動錯誤 //下面咱們再看下經常使用的一些修飾詞 //final 目前來看和java差很少 final String finalStr = "這是一個不可修改的字符串"; //static 目前來看和java差很少 static String staticStr = "這是一個靜態字符串"; //static final 組合使用要注意,static 必須修飾在 final 前面,不然會編譯錯誤,java 中是沒有問題的 static final String staticFinalStr = "這是一個不可修改的靜態字符串"; //const 常量,目前以爲它很是相似 final,可是它只能修飾靜態的 static const String constStr = "這是一個常量"; //_ 下滑線,這個能夠用於大多數名稱(如:變量名,類名等)前,它會將修飾的類或變量私有化,相似 java 的 private String _privateStr = "這是一個私有的字符串"; //下面看下構造器和方法 //構造器 //FirstDart();//沒有定義構造器的時候應該就是這樣的一個默認構造器 //注意:dart 一個類中只能定義一個構造器,可是 dart 對於參數很是自由,下面講方法參數的時候會介紹 FirstDart([String str]) { if (str != null) { this._privateStr = str; } } //方法 void method1() { } //無參無返回 String method2() { return "返回字符串"; } //無參有返回 //能夠看到返回定義是能夠不寫的,可是並不推薦,由於這樣沒有可讀性 method3() { } //默認無返回 method4() { return "返回字符串"; } //默認返回字符串類型 //在方法名前加 _ 就能夠將方法私有化 void _method5() { print("控制檯打印"); //這個方法是內置的,哪裏均可以調用 } //async 異步,方法參數後定義 void method6() async { //await 等待,必須在 async 下使用 await print("初始化"); } //下面看下 dart 中參數能夠怎麼定義 //[] 表示可選參數,顧名思義 能夠傳,也能夠不傳 //注意:可選參數必須定義在一塊兒,放到最後面,傳參時是按照方法順序的 //看到 param4,能夠看到參數定義能夠不指定類型的,應該默認 Object 的,不過不推薦 //以及最後面多出一個逗號也不會有編譯錯誤,java 的話就比較嚴格了,不過這並不能說是優勢 static void method7(int param1, String param2, [double param3, param4, ]) { if (param3 != null) { //假設 param1 = 5,param3 = 2.1 //簡單看下運算符 print(param1 * param3); //輸出:10.5 print(param1 / param3); //輸出:2.380952380952381 print(param1 ~/ param3); //取整,輸出:2 print(param1 % param3); //輸出:0.7999999999999998 //${} 字符串中引入簡單操做 print("param1 + param3 = ${param1 + param3}"); //輸出:param1 + param3 = 7.1 } //若是 param2 = "參數二" print("咱們引入${param2}這個字符串"); //輸出:咱們引入參數二這個字符串 if (param4 != null) { //假設 param4 = "參數四" //{} 花括號在某些狀況是能夠不寫的,可是不推薦 print("這是param4的值是$param4"); //輸出:這是param4的值是參數四 } } //{} 表示命名參數,在調用的時候不須要關心參數順序,但須要指定參數名稱,同時他們都是可選的 //例:FirstDart.method8(param2: "參數二", param1: "參數一"); // FirstDart.method8(param1: "參數一"); static void method8({String param1, String param2}) { } //也能夠這樣組合,可是也要注意,命名參數應該都放在一個 {} 中,並放在最後 //命名參數 包含了 可選參數 的功能,因此他們組合天然是沒有意義的 //例:FirstDart.method9("參數一", param2: "參數二", param3: "參數三"); // FirstDart.method9("參數一"); static void method9(String param1, {String param2, String param3}) { } } //接下來咱們看下類的定義還有哪些東西 //注意:dart 中沒有內部類的概念,不能夠在 class 中再定義一個 class,可是容許一個 .dart 文件中有多個 class //A 這是一個類,同時它也能夠是一個接口,沒有定義構造器的時候還能夠是一個"混合類" class A { void a() { print("這是A的a方法"); } } //extends 繼承,和 java 同樣,只能單繼承 class Ason extends A { } //implements 實現,能夠多實現,可是必須重寫方法 class Aimpl implements A { @override void a() { } } //with 混合,這對我來講是個新鮮概念 //Amixin 可使用 with 多個混合類,同時得到他們的全部方法和屬性,有點多繼承的意思 //它還有不少其餘的用法和講究,後面我再補充 class Amixin with A { } //這裏定義了一個抽象類 B,這個和 java 差很少 abstract class B { void b(); void bImpl() { } } //這是定義了一個枚舉類 C,和 java 有寫區別 enum C { a,b,c } //這是定義了一個混合類 D //注意:混合類沒有構造函數 mixin D on B { //on 是一個關鍵字,它表示混合 D 必須 extends 或 implements B void a() { print("這是D的a方法"); } void d1() { } void d2() { } void d3() { } } //混合 D 必須先繼承 B,由於 B 有抽象方法,因此須要實現 b 方法 //同時混合了 D 和 A,它們都有 a 方法,這時候 Dmixin 對象調用的會是 A 的 a 方法 class Dmixin extends B with D,A { @override void b() { } }
//咱們再定義第二個 .dart 文件,取名叫 secondDart.dart,並與 firstDart.dart 是同一目錄下 //Dart 沒有 package 關鍵字,但也是有 import 的 //咱們使用 import 引入 firstDart.dart,固然同一目錄下是默認引入的 import 'package:firstDart.dart'; //as 指定別名,若是引入的兩個 dart 中有相同的 class,別名能夠解決這個問題 import 'package:firstDart.dart' as first; //deferred as 指定懶加載,顧名思義 import 'package:firstDart.dart' deferred as first; //show,只引入 FirstDart 和 A import 'package:firstDart.dart' show FirstDart,A; //hide,除了 FirstDart 和 A 其餘都引入 import 'package:firstDart.dart' hide FirstDart,A; //若是 firstDart.dart 在 first 包下,則是這樣:import 'package:first/firstDart.dart'; //main 方法,它是程序的入口 void main () { //若是 first 是懶加載的,每次使用的時候須要調用 loadLibrary() 方法 await first.loadLibrary(); FirstDart firstDart = new first.FirstDart("字符串"); //再看下這些基本操做 //for 循環 for (int i = 0; i < 5; i++) { //if 判斷 if (i >= 3) { print("i=${i}"); break; } } bool b = true; //斷言,非真條件終止程序,不推薦使用 assert(b); //while 循環 while(b) { b = false; } int i = 1; //switch 選擇 switch (i) { case 0: print("i=0"); break; case 1: print("i=1"); break; default: print("i=${i}"); } //List 的一些簡單使用 List<String> strList = ["str0", "str1", "str2"]; strList.add("str3"); print(strList.length);//輸出:4 strList[0] = "第一個str"; print(strList[0]);//輸出:第一個str strList.forEach((str) => print(str));//遍歷 //Map 的一些簡單使用 Map<String, String> strMap = {"key1": "value1", "key2": "vlaue2", "key3": "vlaue3"}; strMap.putIfAbsent("key1", () => "newValue1"); strMap.putIfAbsent("key4", () => "value4"); print(strMap.length);//輸出:4 print(strMap["key1"]);//輸出:value1 strMap["key1"] = "newValue1"; print(strMap["key1"]);//輸出:newValue1 strMap.forEach((key,value) => print("${key} = ${value}"));//遍歷 }