什么是Dart語言
Dart語言是谷歌公司在2011年推出的新的計(jì)算機(jī)語言。Dart可以應(yīng)用于web、服務(wù)器、移動(dòng)應(yīng)用和物聯(lián)網(wǎng)等領(lǐng)域的開發(fā)。Dart的終極目標(biāo)是取代JAVAScript。Dart設(shè)計(jì)完全脫離JavaScript,因此它沒有向后兼容JavaScript。Dart語言的發(fā)展始終一直都是不溫不火。
為什么要用Dart
Flutter是谷歌的移動(dòng)UI框架,可以快速在IOS和Android上構(gòu)建高質(zhì)量的原生用戶界面。 Flutter可以與現(xiàn)有的代碼一起工作。在全世界,F(xiàn)lutter正在被越來越多的開發(fā)者和組織使用,并且Flutter是完全免費(fèi)、開源的。Flutter選擇了Dart作為開發(fā)語言,因此想學(xué)習(xí)Flutter就必須先學(xué)習(xí)好Dart。
環(huán)境搭建
下載和安裝Dart
可以從下載到最新版本的Dart。
雙擊下載到的exe文件,依照向?qū)е甘就瓿蒁art的安裝。
安裝驗(yàn)證
1. window鍵+r打開運(yùn)行窗口
1. 在運(yùn)行窗口的打開輸入框輸入cmd,然后點(diǎn)擊確定
1. 在命令行界面輸入命令并按回車
dart --version
安裝Visual Studio Code
很多常見的IDE都有Dart的插件可以使用,這里推薦使用加插件進(jìn)行Dart開發(fā)。可以在下載到Visual Studio Code,安裝完成后可以開始添加插件。
安裝Dart插件
安裝Code Runner插件
helloworld
1. 在VSC新建文件
1. 輸入以下代碼
void main(){ print('hello world');}
1. 在文件上按鼠標(biāo)右鍵,選擇點(diǎn)擊Run Code運(yùn)行
1. 運(yùn)行結(jié)果
變量聲明
var
使用方式與JavaScript的var一致,可以接收任意類型的值。不同的地方是,Dart是強(qiáng)類型語言,賦值以后類型就確定下來,不能再更改為其它類型。
var name;name = 'zhangsan';// 下面的代碼在dart中會(huì)報(bào)錯(cuò),原因是變量name類型已經(jīng)確定為String// 類型一旦確定就不能再更改.name = 100;
final和const
final和const類似都可以定義一個(gè)常量。它們的區(qū)別是const在聲明必須賦值,而final可以先預(yù)聲明需要使用時(shí)再賦值。
// const和final在聲明字面量時(shí)作用是一致的 const PI = 3.14159; final PI2 = 3.14159;// 以下代碼會(huì)報(bào)錯(cuò),原因是常量賦值后就不能再做修改 // PI = 3.1415926535;final now = new DateTime().now(); // 以下代碼在dart中會(huì)報(bào)錯(cuò),const在編譯時(shí)就必要賦值,而new DateTime().now() // 在運(yùn)行才能產(chǎn)生具體的 // const now2 = new DateTime().now();
數(shù)據(jù)類型
Dart內(nèi)置節(jié)以下幾種數(shù)據(jù)類型
· String
· Number
· Boolean
· List(Dart沒有數(shù)組,類似于數(shù)組的作用)
· Map
· Runes(UTF-32字符集的字符)
· Symbols
通過一段代碼來演示以上的數(shù)據(jù)類型
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}
函數(shù)
函數(shù)的返回值
Dart是面向?qū)ο蟮木幊陶Z言,所以函數(shù)也是一個(gè)對(duì)象,還有一種類型Function,也就是說函數(shù)可以賦值給某個(gè)變量或者作為參數(shù)傳給另外的函數(shù)。Dart建議給函數(shù)添加上返回類型,但是不加返回類型的函數(shù)同樣可以正常工作,另外還可以用lamda表達(dá)式,比如下面的代碼:
// 聲明返回類型
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}
命名參數(shù)、位置參數(shù)、參數(shù)默認(rèn)值
命名參數(shù)
使用花括號(hào)將函數(shù)的參數(shù)括起來就是定義了命名參數(shù),如下面的代碼所示:
```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'); }```
從上面代碼可以看到,命名參數(shù)時(shí)可以使用{type paramName}或者{paramName: type}兩種方式聲明參數(shù),而調(diào)用命名參數(shù)時(shí),需要以funcName(paramName: paramValue)的形式調(diào)用。
命名參數(shù)的參數(shù)并不是必須的,所以上面的代碼中,如果調(diào)用sayHi()不帶任何參數(shù),也是可以的,只不過最后打印出來的結(jié)果是:hello, my name is null。
位置參數(shù)
使用中括號(hào)[]括起來的參數(shù)是函數(shù)的位置參數(shù),代表該參數(shù)可傳可不傳,位置參數(shù)只能放在函數(shù)的參數(shù)列表的最后面,如下代碼所示:
```dart sayHello(String name, int age, [String hobby]) { // 位置參數(shù)可以有多個(gè),比如[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");}```
參數(shù)默認(rèn)值
可以為命名參數(shù)或者位置參數(shù)設(shè)置默認(rèn)值,如下代碼所示:
```// 命名參數(shù)的默認(rèn)值int add({int a, int b = 3}) { return a + b;}// 位置參數(shù)的默認(rèn)值int sum(int a, int b, [int c = 3]) { return a + b + c;}```
main()函數(shù)
不論在Dart還是Flutter中,必須都需要一個(gè)頂層的main()函數(shù),它是整個(gè)應(yīng)用的入口函數(shù),main()函數(shù)的返回值是void,還有一個(gè)可選的參數(shù),參數(shù)類型是List。
匿名函數(shù)
大多數(shù)函數(shù)都是有名稱的,比如main() hello()等,但是也可以寫匿名函數(shù),如果對(duì)JavaScript比較熟悉,看到下面的肯定也不會(huì)陌生:
test(Function callback) {
callback("hello");}
main() { test((param) {
// 打印hello print(param);
});}
匿名函數(shù)類似于Java中的接口,往往在某個(gè)函數(shù)的參數(shù)為函數(shù)時(shí)使用到。
函數(shù)返回值
所有的函數(shù)都有返回值,如果沒有指定return語句,那么該函數(shù)的返回值為null。
運(yùn)算符
Dart中的運(yùn)算符與JavaScript中的類似,比如++a、a == b、b ? a : b,但是也有一些與JavaScript不太一樣的運(yùn)算符,下面用代碼說明:
main() {
// 與JavaScript相同的運(yùn)算符操作
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不一樣的運(yùn)算符操作
// is運(yùn)算符用于判斷一個(gè)變量是不是某個(gè)類型的數(shù)據(jù)
// is!則是判斷變量不是某個(gè)類型的數(shù)據(jù)
var s = "hello";
print(s is String); // true
var num = 6; print(num is! String); // true
// ~/才是取整運(yùn)算符,如果使用/則是除法運(yùn)算,不取整
int k = 1;
int j = 2;
print(k / j); // 0.5
print(k ~/ j); // 0
// ??=運(yùn)算符 如果 ??= 運(yùn)算符前面的變量為null,則賦值,否則不賦值
var param1 = "hello", param2 = null;
param1 ??= "world";
param2 ??= "world";
print("param1 = $param1"); // param1 = hello
print("param2 = $param2"); // param2 = world
// ?.運(yùn)算符
var str1 = "hello world";
var str2 = null;
print(str1?.length); // 11
print(str2?.length); // null
print(str2.length); // 報(bào)錯(cuò)}
控制流程
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語句中的數(shù)據(jù)類型必須是跟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); }
// 箭頭函數(shù)參數(shù)必須要用圓括號(hào)擴(kuò)起來 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
}
}
總結(jié)
在這里我們學(xué)習(xí)了怎樣配置Dart的開發(fā)環(huán)境,對(duì)變量聲明、數(shù)據(jù)類型、函數(shù)、運(yùn)算符、控制流程語法進(jìn)行說明,為更深入學(xué)習(xí)Dart或者Flutter打下基礎(chǔ)。






