文章大綱
引言
Dart 是谷歌在 2011 年推出的編程語言,是一種結構化 Web 編程語言,允許用戶通過 Chromium 中所整合的虛擬機(Dart VM)直接運行 Dart 語言編寫的程序,免去了單獨編譯的步驟。以後這些程序將從 Dart VM 更快的性能與較低的啓動延遲中受益。Dart 從設計之初就爲配合現代 web 整體運作而考慮,開發團隊也同時在持續改進 Dart 向 JavaScript 轉換的快速編譯器。Dart VM 以及現代 JavaScript 引擎(V8 等)都是 Dart 語言的首選目標平臺,也是將來轉向Flutter的必學語言。
一、Flutter 開發環境配置
Flutter 開發環境配置十分簡單,無論是Windows還是iOS平臺,主要步驟都分爲兩步:
1、下載Flutter SDK
打開flutter官網,找到下載地址,考慮到國內的網絡的原因,會有兩類下載鏈接,一種是windows平臺原始下載地址(可能需要翻牆),另一種是鏡像地址點擊即可,只要你的網速好。
2、配置系統環境變量PUB_HOSTED_URL和FLUTTER_STORAGE_BASE_URL
由於國內的特殊網絡環境必須配置這兩個指定的環境變量用於Flutter的升級維護。
PUB_HOSTED_URL=https://pub.flutter-io.cn
FLUTTER_STORAGE_BASE_URL=https://storage.flutter-io.cn
或者交大的鏡像地址
FLUTTER_STORAGE_BASE_URL= https://mirrors.sjtug.sjtu.edu.cn/
PUB_HOSTED_URL= https://dart-pub.mirrors.sjtug.sjtu.edu.cn/
3、將SDK解壓到你想安裝Flutter SDK的路徑並配置path環境變量
你可以將SDK 解壓到任何地方,但不要將Flutter安裝到需要一些高權限的路徑(如C:\Program Files\),
爲了方便通過命令行執行這些Flutter工具指令你還可以把這些對應的路徑配置到系統環境變量path下(非必需的),所有配置完畢之後,在Flutter安裝目錄的flutter文件下找到flutter_console.bat,雙擊運行並啓動flutter命令行,接下來,你就可以在Flutter命令行運行flutter命令了,再運行 flutter doctor命令。
在Flutter命令行運行如下命令來查看是否還需要安裝其它依賴,如果需要,會自動安裝它們,該命令檢查你的環境並在命令行窗口中顯示報告,仔細檢查命令行輸出以獲取可能需要安裝的其他軟件或進一步需要執行的任務。
4、安裝開發Dart 和Flutter插件
不同的開發工具安裝插件的流程有所不同,如果是用Android Studio來開發的,所以你只需要在找到Dart 和Flutter插件安裝,安裝成功之後你就會在Android Studio的菜單欄上看到新增了一個命令——New Flutter Project,接着就Enjoy your Flutter吧!
二、Dart語言概述
站在巨人肩上就看得更高,Dart語言在設計時既借鑑了Java和JavaScript等現有程序語言的部分特性(在靜態語法方面和Java非常相似,如類型定義、函數聲明、泛型等,而在動態特性方面又和JavaScript很像比如函數式特性、異步支持等。),也開發了自己獨特的機制,在Dart中一切一切都是對象,每個變量都是一個對象,每個對象都是一個類的實例(對象的默認值爲null),所有類型的初始化爲null(沒有初始化的變量自動獲取默認值null),包括bool、num類型,因爲所有的類型都是對象(所有對象都繼承自Object類)。
三、Dart 語言基本語法
1、內置數據類型
Dart語言支持以下的數據類型,絕大部分和其他程序語言差不多。
1.1、 數字類型Numbers
Dart的數字類型的包括num、int(範圍-2的53次方到2的53次方)、double(64位雙精度浮點數),其中int、double都是num的子類型,由於Dart中每一個變量都是對應類的一個實例,所以可以直接調用所擁有的方法。
var x = 1;//int型
int y=1;
var hex = 0xDEADBEEF;//int 型
double d = 1.1;//double類型
var f= 1.42e5;
x.abs();
y.abs();
d.abs();
最後int 類型也支持傳統按位移位(<<,>>),與(&)和或(|)運算符
1.2、 字符串類型
Dart字符串是UTF-16編碼單元的序列,使用單或雙引號來創建一個字符串。
- 直接使用一個單引號或一個雙引號創建一個字符串
- 可以使用 ${expression} 獲取字符串值,expression爲合法的表達式
- 使用連接符“+” 或者 鄰接字符串方式創建字符串
- 使用 r 輸出原始的字符串
String s1 = '字符串1';//s1 引用字符
var s2 = "字符串1";
var s3 = 'It\'s easy to escape the string delimiter.';
var s4 = 'crazy' 'mo' ' blog';//Dart會自動把這三個子串合併到s4中
var usr="crazy";
var name="mo";
print('${usr+name}');//輸出“crazymo”
var s5 = '''
You can create
multi-line strings like this one.
''';//使用三引號(單或雙引號)創建一個多行字符串:
var s6 = r"""This is\t also a multi-line string.""";
print(s6);//輸出原始的字符串,包含轉義或其他特殊的字符串This is\t also a multi-line string.
1.3、布爾類型
bool name = true;
if (name) {
print('You have a name!');
}
1.4、列表類型List
Dart中列表類型List是用於保存一組相同類型且有序元素,可以直接打印List 包括List的元素,List的下標索引也是從0開始,泛型語法也和Java 差不多,有增刪改查api且還支持倒序、排序、洗牌和使用 + 號運算符可把兩個List合併。
var list = [1, 2, 3];//靜態初始化,長度還未確定
list.add(22);
for(var k=0;k<list.length ;k++){
print("${list[k]}\t");
}
List list2=List();//List list2=new List(); var list2=List();動態初始化,長度還未確定
list2.add("cmo");
for(var k=0;k<list2.length ;k++){
print("${list2[k]}\t");
}
List list2=List(3);//初始化長度爲3
1.5、 映射類型Map
一個 map 是一個對象,相關聯的鍵和值,這兩個鍵和值可以是任何類型的對象。
//靜態初始化
var gifts = {
// 鍵 值
'first' : 'partridge',
'second': 'turtledoves',
'fifth' : 'golden rings'
};
gifts['six']='dota2';//增加鍵值對,其中six 未存在與原來的map 映射中
print(gifts['six'].toString());//根據鍵獲取對應的值
gifts['six']='dota3';//更新鍵對應的值
print(gifts['six'].toString());//根據鍵獲取對應的新值
//動態創建
var nobleGases = new Map();
nobleGases[2] = 'helium';
nobleGases[18] = 'argon';
print(nobleGases[2].toString());//根據鍵獲取對應的值
1.7、Set 集合類型
Dart 的Set 比Java 更強大,還提供了集合的常見數學運算求補集、交集、並集等。
Set set=Set();
set.addAll([1,2,3,4]);
Set set2=Set();
set2.addAll([3,4,5,6]);
var diff=set.difference(set2);
print(diff);//{1,2}
var intersect=set.intersection(set2);
print(intersect);//{3,4}
var un=set.union(set2);
print(un);//{1,2,3,4,5,6}
1.8、Runes
原始Unicode編碼字符串,比如說輸出emoji 表情
Runes runes=Runes('\u{1f604} \u6211');
var str=String.fromCharCodes(runes);
print(str);
1.9、 符號類型
一個符號對象表示在Dart程序中聲明的操作符或標識,以前老版本在反射中需要用到,現在dart:mirrors反射庫已被移除,所以…
2、類型轉換
// String -> int
var one = int.parse('1');
assert(one == 1);
// String -> double
var onePointOne = double.parse('1.1');
assert(onePointOne == 1.1);
// int -> String
String oneAsString = 1.toString();
assert(oneAsString == '1');
// double -> String
String piAsString = 3.14159.toStringAsFixed(2);
assert(piAsString == '3.14');
3、常用檢查
// 檢查一個空字符串.
var fullName = '';
assert(fullName.isEmpty);
// 檢查爲零.
var hitPoints = 0;
assert(hitPoints <= 0);
// 檢查是否爲空.
var unicorn;
assert(unicorn == null);
// 檢查NaN.
var iMeantToDoThis = 0 / 0;
assert(iMeantToDoThis.isNaN);
4、變量定義
Dart定義變量的形式有三種:
4.1、使用內置類型進行聲明
在變量聲明中添加靜態類型,即 內置類型 變量名形式,也可以不進行初始化賦值,後續再賦值。
4.2、使用var 進行聲明
使用var 聲明,即var 變量名形式,如果不進行初始化賦值的話,var 可以理解成是動態類型,可以代表任何類型,但是一進行初始化之後,對應的變量名則被編譯器確定爲一個類型就不能用其他不同類型賦值。
var usr="blog.csdn.net/CrazyMo_";
print(usr);
usr="cmo";
print(usr);
// usr=666666; 編譯錯誤
var 可接收任何類型,但是一經賦值,數據類型就被自動確定,就不能再改變其數據類型,因爲在Dart中 使用var 聲明之後,在編譯時會自動根據第一次賦值的數據類型來推斷類型,所以編譯結束後數據類型就已經確定。
4.3、使用final和const 進行聲明
如果從不打算改變一個變量,使用 final 或者 const 代替 var 或者其他類型。一個 final 變量只能被設置一次,而一個 const 變量是一個編譯時常數。
final id = 'Crzy'; // Or: final String name = 'Crzy';
print(id);
const money = 999999;//Or :const int money=999999;
print(money);
const和final修飾的變量本身皆是永不可變的,但有有些區別。使用const初始化之後則只可讀不可寫,而且具有傳遞性,體現在如果修飾的是數據或其他容器類數據,則容器內的元素也不可改變;而final 不具有傳遞性,不會影響到容器內的元素的操作。
const arr=[2,4,6];
const arr2=[2,4,6];
print(identical(arr,arr2));//返回true
///arr2[2]=88;
final arr3=[2,4,6];
final arr4=[2,4,6];
print(identical(arr3,arr4));//返回false
arr3[2]=99;
print(arr3[2]);//返回false
const w=10;
const h=68;
const square=w*h;
const和final小結:
- 類級別的常量,使用static const 修飾
- const 可使用其他const常量的值來進行初始化
- 可以更改非final、非const 變量的值,即使曾經具有const值
- const 導致的不可變性是可傳遞的
- 相同的const 常量不會再內存中重複創建
- const 需要是編譯時的常量。
- 聲明的類型可以省略,一經初始化後本身就不可改變,且不能與var同時使用。
4.3、使用dynamic 聲明變量
dynamic 大體上與var大同小異,區別在於var 一經初始化類型便被鎖定,而使用dynamic 聲明的變量即使進行了初始化賦值之後,也可以再次賦予不同的數據類型,從這個角度來說與Object 類型,但又與Object不同,Object 聲明的變量會在編譯時進行檢查類型,而dynamic 則在編譯期不進行檢查,所以在編譯的時候會通過。
dynamic d=6666;
d="cmo";
d.test();//編譯通過雖然d中並沒有test方法但運行的時候報錯
Object obj=8888;
////obj.test(); 編譯出錯。
5、操作符
介紹 | 符號 |
---|---|
一元后綴符 | expr++、 expr–、 () 、[]、 .、?. |
一元前綴符 | -expr、 !expr、 ~expr、 ++expr、 –expr |
乘法類型 | * 、/、 %、 ~/ |
加法類型 | +、 - |
位操作符 | << 、>> |
按位與 | & |
按位異或 | ^ |
按爲或 | I |
比較和類型測試 | >= 、<=、 > 、<、 as、 is、 is! |
等價 | == 、!= |
邏輯與 | && |
邏輯或 | II |
條件運算符 | expr1 ? expr2 : expr3 |
級聯運算符 | . . 就是實現鏈式調用的效果 |
賦值 | =、 = 、/=、 ~/=、 %=、 +=、 -= 、<<=、 >>= 、&=*、 ^=、 I= |
//?.
String st;
print(st!=null ? st.length : null);//輸出null
print(st ?.length);//輸出null,如果st爲null 則輸出null 反之輸出st.length
//~/ 除後取整,即返回商的指
print(3/2);//輸出1.5
print(3~/2);//輸出1
//as 類型轉換
num n=2;
int k=n as int;
//is、 is! 類型判斷
num n=2;
num m=6;
double dd=3.14;
print(m is int); //true
print(dd is int); //false
int k=n as int;
print(k is! String); //true
int j=90;
print(j is num);//true
// exp1 ?? exp2 如果exp1 不爲null 則取exp1 的值,exp1爲null則把exp2的值付給exp1
bool isPlay;
isPlay =isPlay ?? false;
print(isPlay);//false
//.. 級聯運算符
List list2= List();
list2..add(99)..add(88);
print(list2);
6、控制流語句
Dart在控制流語句方面和Java 等前輩語言沒多大區別,同樣支持if 和 else、
for 循環、while 和 do-while循環、break和continue、switch和 case、try 和 catch finaly、throw 與 assert,只是for循環語句在原來的基礎上增加了閉包支持。
//if 和 else
if(con1){
}else if (con2){
}else{
}
//while 和 do-while循環
while(!isDone()){
doSomething();
}
do{
}while(!atEndOfPage());
//try catch
try {
breedMoreLlamas();
} on OutOfLlamasException {
// 一個具體異常
buyMoreLlamas();
} on Exception catch (e) {
// 任意一個異常
print('Unknown exception: $e');
} catch (e) {
// 非具體類型
print('Something really unknown: $e');
}
6.1、switch case
每一個不爲空的case分句都以break語句結尾.其他正確的結尾方式也可以使用continue,throw或者return語句來實現。 當沒有任何case分句的條件符合時,使用default分句來執行代碼
var command = 'b';
switch (command){
case 'a':
print("a");
break;
case 'b':
print("先打印b");
continue startC;//繼續在 startC標記的地方執行
startC:
case 'c':
print("最後執行穿透");
break;
default:
print("a2222");
break;
}
//最終輸出:先打印b
// 最後執行穿透
6.2、Dart的for循環中的閉包能獲取循環變量的值
除了支持常規的索引迭代和forEach 方法之外,Dart的for循環中的閉包能獲取循環變量的值
var callbacks = [];
for(var i=0;i<2;i++){
callbacks.add(() => print(i));
}
callbacks.forEach((c) =>c());
7、異常處理
異常也分爲Exception和Erro 兩大類,大體上與Java類似,但是具體語法有所增強。
//throw new FormatException("格式化異常");
//throw new NullThrownError("錯誤類型");
//throw '任意非null類型';
try{
}on Error{
//如果發生Error類型的異常則直接在這裏捕獲,不會進到catch語句
}on Exception catch(e){
print(e);
}catch(e,s){
}finally{
}
7.1、Exception
7.2、Erro
未完待續…