什么是Dart語言
Dart語言是谷歌公司在2011年推出的新的計算機語言。Dart可以應用于web、服務器、移動應用和物聯網等領域的開發。Dart的終極目標是取代JAVAScript。Dart設計完全脫離JavaScript,因此它沒有向后兼容JavaScript。Dart語言的發展始終一直都是不溫不火。
為什么要用Dart
Flutter是谷歌的移動UI框架,可以快速在IOS和Android上構建高質量的原生用戶界面。 Flutter可以與現有的代碼一起工作。在全世界,Flutter正在被越來越多的開發者和組織使用,并且Flutter是完全免費、開源的。Flutter選擇了Dart作為開發語言,因此想學習Flutter就必須先學習好Dart。
環境搭建
下載和安裝Dart
可以從下載到最新版本的Dart。
雙擊下載到的exe文件,依照向導指示完成Dart的安裝。
安裝驗證
1. window鍵+r打開運行窗口
1. 在運行窗口的打開輸入框輸入cmd,然后點擊確定
1. 在命令行界面輸入命令并按回車
dart --version
安裝Visual Studio Code
很多常見的IDE都有Dart的插件可以使用,這里推薦使用加插件進行Dart開發。可以在下載到Visual Studio Code,安裝完成后可以開始添加插件。
安裝Dart插件
安裝Code Runner插件
helloworld
1. 在VSC新建文件
1. 輸入以下代碼
void main(){ print('hello world');}
1. 在文件上按鼠標右鍵,選擇點擊Run Code運行
1. 運行結果
變量聲明
var
使用方式與JavaScript的var一致,可以接收任意類型的值。不同的地方是,Dart是強類型語言,賦值以后類型就確定下來,不能再更改為其它類型。
var name;name = 'zhangsan';// 下面的代碼在dart中會報錯,原因是變量name類型已經確定為String// 類型一旦確定就不能再更改.name = 100;
final和const
final和const類似都可以定義一個常量。它們的區別是const在聲明必須賦值,而final可以先預聲明需要使用時再賦值。
// const和final在聲明字面量時作用是一致的 const PI = 3.14159; final PI2 = 3.14159;// 以下代碼會報錯,原因是常量賦值后就不能再做修改 // PI = 3.1415926535;final now = new DateTime().now(); // 以下代碼在dart中會報錯,const在編譯時就必要賦值,而new DateTime().now() // 在運行才能產生具體的 // const now2 = new DateTime().now();
數據類型
Dart內置節以下幾種數據類型
· String
· Number
· Boolean
· List(Dart沒有數組,類似于數組的作用)
· Map
· Runes(UTF-32字符集的字符)
· Symbols
通過一段代碼來演示以上的數據類型
void main(){ // Number int a = 1; double b = 0.1; // String var s1 = 'this is a string'; String s2 = "this is another string"; // boolean var flag = true; bool flag2 = false; // List List list = [1, 2, 3, 4, 5]; List<String> list2 = ['zhang', 'san', "123", "456"]; List<dynamic> list3 = [1, true, 'haha', 1.0]; // Map Map person = new Map(); map['name'] = 'zhangsan'; map['age'] = 22; // Dart使用runes來獲取UTF-32字符集的字符。String的codeUnitAt and codeUnit屬性可以獲取UTF-16字符集的字符 var clApping = '\u{1f44f}'; print(clapping); // 打印的是拍手emoji的表情 // symbols print(#s == new Symbol("s")); // true}
函數
函數的返回值
Dart是面向對象的編程語言,所以函數也是一個對象,還有一種類型Function,也就是說函數可以賦值給某個變量或者作為參數傳給另外的函數。Dart建議給函數添加上返回類型,但是不加返回類型的函數同樣可以正常工作,另外還可以用lamda表達式,比如下面的代碼:
// 聲明返回類型 int add(int a, int b) { return a + b; } // 不聲明返回類型add2(int a, int b) { return a + b;} // =>是return語句的簡寫add3(a, b) => a + b;main() { print(add(1, 2));//3 print(add2(2, 3)); // 5 print(add3(1, 2)); // 3}
命名參數、位置參數、參數默認值
命名參數
使用花括號將函數的參數括起來就是定義了命名參數,如下面的代碼所示:
```dart sayHi({String name}) { print("hello, my name is $name");}
sayHi2({name: String}) { print("hello, my name is $name");}
main() { // 打印 hello, my name is zhangsan sayHi(name: 'zhangsan');
// 打印 hello, my name is wangwu sayHi2(name: 'wangwu'); }```
從上面代碼可以看到,命名參數時可以使用{type paramName}或者{paramName: type}兩種方式聲明參數,而調用命名參數時,需要以funcName(paramName: paramValue)的形式調用。
命名參數的參數并不是必須的,所以上面的代碼中,如果調用sayHi()不帶任何參數,也是可以的,只不過最后打印出來的結果是:hello, my name is null。
位置參數
使用中括號[]括起來的參數是函數的位置參數,代表該參數可傳可不傳,位置參數只能放在函數的參數列表的最后面,如下代碼所示:
```dart sayHello(String name, int age, [String hobby]) { // 位置參數可以有多個,比如[String a, int b] var msg = "hello, this is $name and I am $age years old"; if (hobby != null) { msg = "$msg, my hobby is $hobby"); } print(msg);} main() { // hello, this is zhangsan and I am 20 years old sayHello("zhangsan", 20); // hello, this is zhangsan and I am 20 years old, my hobby is play tv game sayHello("zhangsan", 20, "play tv game");}```
參數默認值
可以為命名參數或者位置參數設置默認值,如下代碼所示:
```// 命名參數的默認值int add({int a, int b = 3}) { return a + b;}// 位置參數的默認值int sum(int a, int b, [int c = 3]) { return a + b + c;}```
main()函數
不論在Dart還是Flutter中,必須都需要一個頂層的main()函數,它是整個應用的入口函數,main()函數的返回值是void,還有一個可選的參數,參數類型是List。
匿名函數
大多數函數都是有名稱的,比如main() hello()等,但是也可以寫匿名函數,如果對JavaScript比較熟悉,看到下面的肯定也不會陌生:
test(Function callback) { callback("hello");} main() { test((param) { // 打印hello print(param); });}
匿名函數類似于Java中的接口,往往在某個函數的參數為函數時使用到。
函數返回值
所有的函數都有返回值,如果沒有指定return語句,那么該函數的返回值為null。
運算符
Dart中的運算符與JavaScript中的類似,比如++a、a == b、b ? a : b,但是也有一些與JavaScript不太一樣的運算符,下面用代碼說明:
main() { // 與JavaScript相同的運算符操作 int a = 1; ++a; a++; var b = 1; print(a == b); // false print(a * b); // 3 bool real = false; real ? print('real') : print('not real'); // not real print(real && a == b); // false print(real || a == 3); // true print(a != 2); // true print(a <= b); // false var c = 9; c += 10; print("c = $c"); // c = 19 print(1<<2); // 4 // 與JavaScript不一樣的運算符操作 // is運算符用于判斷一個變量是不是某個類型的數據 // is!則是判斷變量不是某個類型的數據 var s = "hello"; print(s is String); // true var num = 6; print(num is! String); // true // ~/才是取整運算符,如果使用/則是除法運算,不取整 int k = 1; int j = 2; print(k / j); // 0.5 print(k ~/ j); // 0 // ??=運算符 如果 ??= 運算符前面的變量為null,則賦值,否則不賦值 var param1 = "hello", param2 = null; param1 ??= "world"; param2 ??= "world"; print("param1 = $param1"); // param1 = hello print("param2 = $param2"); // param2 = world // ?.運算符 var str1 = "hello world"; var str2 = null; print(str1?.length); // 11 print(str2?.length); // null print(str2.length); // 報錯}
控制流程
if...else, switch, for, while, try...catch語句跟JavaScript中都類似,try...catch語句可能稍有不同,下面用一段代碼說明:
main() { // if...else語句 int score = 80; if (score < 60) { print("so bad!"); } else if (score >= 60 && score < 80) { print("just pass!"); } else if (score >= 80) { print("well done!"); } // switch語句 String a = "hello"; // case語句中的數據類型必須是跟switch中的類型一致 switch (a) { case "hello": print("good weather"); break; case "world": print("good morning"); break; default: print("good bye"); } // for語句 List<String> list = ["a", "b", "c"]; for (int i = 0; i < list.length; i++) { print(list[i]); } for (var i in list) { print(i); } // 箭頭函數參數必須要用圓括號擴起來 list.forEach((item) => print(item)); // while語句 int start = 1; int sum = 0; while (start <= 100) { sum += start; start++; } print(sum); // try...catch語句 try { print(1 ~/ 0); } catch (e) { // IntegerDivisionByZeroException print(e); } try { 1 ~/ 0; } on IntegerDivisionByZeroException { // 捕獲指定類型的異常 print("error"); // 打印出error } finally { print("finally"); // 打印出finally } }
總結
在這里我們學習了怎樣配置Dart的開發環境,對變量聲明、數據類型、函數、運算符、控制流程語法進行說明,為更深入學習Dart或者Flutter打下基礎。