一. Dart開發(fā)環(huán)境的配置
Dart SDK Install
官方文檔
https://webdev.dartlang.org/guides/get-started
此處指說明在Mac上的環(huán)境搭建
安裝Dart SDK
> brew tap dart-lang/dart
> brew install dart
Dart IDE Install
此處推薦的IDE為 VSCode, WebStorm, Intellij IDEA, Android Studio.
Dart Plugin Install
插件安裝
VS Code 中安裝Dart language plugin

插件安裝
Android Studio 中安裝Dart language plugin
二. Dart開發(fā)入門
// 函數(shù)入口
void main () {
print("This is Carson");
}

執(zhí)行結(jié)果
三. Dart變量類型
var 聲明變量, 當(dāng)未初始化的時(shí)候, 變量值為null;
var a = 10;
使用關(guān)鍵字 final聲明的變量只能賦一次值
final b = "Hello world!"
使用關(guān)鍵字const來修飾常量
const c = "Hi there!";
const修飾的常量與final修飾的變量的區(qū)別為 const修飾的常量必須為編譯階段就知道的常量例如不會改變的常量字符串,整型值等.
四. Dart數(shù)據(jù)類型
Dart內(nèi)置的數(shù)據(jù)類型 數(shù)值型-num 字符型-String 布爾型-Boolean 列表型-List 鍵值對-Map
此外還有 Runes, Symbols
// num類型有兩種 Int與double類型
num a = 123;
int b = 123;
double = 123.12;
// 數(shù)值型操作
// 運(yùn)算符 + - * / %
// 特別注意的是 ~/ 這個(gè) 為取整
// 常用屬性 isNaN
// 常用方法
// abs()絕對值
// isEven()為偶數(shù)
// isOdd()為奇數(shù)
// 以下double類型的方法
// floor()為不大于其的最小整數(shù)
// ceil()為不小于其的最小整數(shù)
// round()為四舍五入
// 字符串類型
String str0 = "Hello";
String str1 = 'World';
String str2 = '''Hello
world''';
// 字符串類型可以為"" '' ''''''來表示
String str3 = 'hello \n world';
String str4 = r'hello \n world'; // 等價(jià)于'hello \\n world';
// 轉(zhuǎn)義\n
// 字符串常用方法
String str5 = str4.toUpperCase(); // 轉(zhuǎn)為大寫字母字符串
String str6 = str4.toLowerCase(); // 轉(zhuǎn)為小寫字母字符串
print(str6 * 5); // 為str6字符串 *5次打印
print(str5 == str6); // == 為字符串比較是否相等
print(str5[0]); // 根據(jù)對應(yīng)的下標(biāo)取出對應(yīng)的字符
// 插值表達(dá)式: ${expression}
int z = 3;
int y = 5;
print("a + b = ${z + y}");
// 輸出為 a + b = 8;
print("a = $z");
// 輸出為 a = 3;
print(str6.isEmpty); // 判空
print(str6.isNotEmpty); // 判斷是否不是空字符串
print(str6.length); // 截取長度
print(str6.isEmpty); // 判空
print(str6.isNotEmpty); // 判斷是否不是空字符串
print(str6.length); // 截取長度
print(str6.contains("A")); // 是否包含字符
print(str6.indexOf("D")); // "D"在字符串中的下標(biāo)
print(str6.lastIndexOf("D")); // "D"在字符串中的反取下標(biāo)
print(str6.substring(2)); // 下標(biāo)2開始截取出剩余的字符串
print(str6.substring(2, 4)); // 下標(biāo)2開始至下標(biāo)4截取出剩余的字符串
print(str6.startsWith("A")); // 是否為"A"開頭的字符串
print(str6.endsWith("C")); // 是否為"C"開頭的字符串
print(str6.trim()); // 截取字符串前后空格
print(str6.trimRight()); // 截取字符串右邊空格
print(str6.trimLeft()); // 截取字符串左邊空格
String str7 = "1 3 2 3 4";
var list = str7.split(" "); // 通過" "字符分割str7字符串為數(shù)組
// 布爾型
bool isTrue = true;
bool isFalse = false;
// List(數(shù)組)
var list = [1,2,3,4,1]; // 數(shù)組創(chuàng)建
var cList = const [1,23,123,1]; // 不可變數(shù)組創(chuàng)建(即數(shù)組中不同的元素不可以被更改)
var newList = new List(); // 類構(gòu)造的方式創(chuàng)建List
// 常用的操作方式
newList.add(1); // 添加元素
newList.indexOf(1); // 元素在數(shù)組中的下標(biāo)
newList.insert(0, "123"); // 在固定的下標(biāo)插入元素
newList.remove(1); // 刪除數(shù)組中的元素
newList.removeAt(0); // 刪除指定下標(biāo)的元素
newList.clear(); // 清空數(shù)組中所有元素
newList.indexOf(1); // 獲取1在數(shù)組中的下標(biāo)
newList.lastIndexOf(1); // 獲取1在數(shù)組中倒序下標(biāo)
newList.sort(); // 排序數(shù)組
newList.sublist(0); // 從哪個(gè)下標(biāo)開始獲取子List
newList.shuffle(); // 打亂數(shù)組(洗牌算法)
newList.asMap(); // 轉(zhuǎn)換為Map
newList.forEach(print); // print為一個(gè)Method此處為遍歷數(shù)組并打印
// Map (Key Value 鍵值對)
var map = {'first': 1, 'second':2 }; // 創(chuàng)建可變Map
var cMap = const {'first': 1, 'second':2, 'third':3 }; // 創(chuàng)建靜態(tài)Map
var newMap = new Map(); // 類構(gòu)造方法創(chuàng)建Map
print(map.keys); // Map中所有的Keys List
print(map.values); // Map中所有的values List
print(map.length); // Map的長度
print(map.isNotEmpty); // Map是否不為空
print(map.isEmpty); // Map是否為空
print(map.containsKey("first")); // Map是否包含此"First"的Key值
print(map.containsValue(1)); // Map中是否包含1的value值
map.remove("first"); // Map中移除key為"first"的鍵值對
List arr = [12,123,123,123,12321,213123];
Map tMap = arr.asMap(); // 將List轉(zhuǎn)換為Map
// dynamic類型(類似于泛型, 可以為動態(tài)類型)
var list = new List<dynamic>();
list.add("1");
list.add(12);
list.add(true);
五. 運(yùn)算符
// 數(shù)據(jù)運(yùn)算符
int a = 13;
int b = 12;
print(a + b); // 加
print(a - b); // 減
print(a * b); // 乘
print(a / b); // 除
print(a % b); // 取余
print(a ~/ b); // 取整
print(++a); // 加完再用
print(a++); // 先用再加
print(--b); // 減完再用
print(b--); // 先用再減
// 關(guān)系運(yùn)算符
// == 等于 判斷內(nèi)容相等
// != 不等于
// > 大于
// < 小于
// >= 大于等于
// <= 小于等于
// 邏輯運(yùn)算符
// !
// &&
// ||
// 針對布爾值的運(yùn)算
// 賦值運(yùn)算符
// =
// ??= 當(dāng)變量值不存在的時(shí)候,為變量賦值=后方的值
// 復(fù)合運(yùn)算符 (以下均為變量與右側(cè)值進(jìn)行運(yùn)算將結(jié)果賦值左側(cè)變量)
// +=
// -=
// *=
// /=
// %=
// ~/=
// 條件表達(dá)式
// 三目運(yùn)算
int res = 3 > 2 ? 3:2;
// ?? 表達(dá)式 ??前值為null是則賦值??后的值
int value1 = 10;
int value2 = value1 ?? 4;
六.控制流語句
// 條件語句
// if 條件語句
String gender = "Male";
if (gender == "Male") {
print("Male");
} else {
print("Female");
}
// switch case 語句
int score = 90;
switch (score) {
case 100:
{
print("Perfect!");
}
break;
case 90:
{
print("Normal");
}
break;
default:
}
// 循環(huán)語句
// for循環(huán)
var newList = [1,2,3,1,23,2,32,3];
for (int i = 0; i < newList.length; i++) {
print(newList[i]);
}
for (var item in newList) {
print(item);
}
// while循環(huán)
int i = 100;
while (i-- > 0) {
print(i);
}
// do while循環(huán)
int j = 100;
do {
print(j);
} while (j-- > 0);
// break 終止所在的循環(huán)
// continue 跳出當(dāng)前循環(huán)
// switch case 語句
// Dart 中的Switch...case語句,
// 比較的類型可以為num,String,編譯期常量,對象,枚舉
// 非空的case必須要有break關(guān)鍵字
// continue關(guān)鍵字可以切換跳轉(zhuǎn)執(zhí)行語句
int score = 90;
switch (score) {
A:
case 100:
{
print("Perfect!");
}
break;
case 90:
{
print("Normal");
continue A;
}
break;
default:
}
七. 方法定義
// 方法定義
// 與其他語言一致, 需要有方法名, 返回值類型, 形參類型, 方法體;
String getPersonName() {
return "Carson";
}
// 方法特性
// 方法也是對象,并且有具體類型的Function
// 返回值類型,參數(shù)類型都可以省略
// 箭頭語法: => expr是{ return expr;}縮寫.只試用一個(gè)表達(dá)式
// 方法都會有返回值
getPersonAge(age) {
print(age);
}
// 箭頭語法聲明方法
getPersonSex (sex) => "sex=$sex"; // 此方法為返回值字符串
// 可選參數(shù)(注:可選參數(shù)的命名必須在必填參數(shù)之后)
// 可選命名參數(shù) {param1,param2,...}
getPerson1(name, {age, gender}) {
print("name=$name, age=$age, gender=$gender");
}
// 方法調(diào)用
getPerson1("Carson");
getPerson1("Carson", age: 12);
getPerson1("Carson", age: 12, gender: "Male");
// 可選位置參數(shù) [param1,param2,...]
getPerson2(name, [age, gender]) {
print("name=$name, age=$age, gender=$gender");
}
// 方法調(diào)用
getPerson2("Carson");
getPerson2("Carson", 12);
getPerson2("Carson", 12, "Male");
// 默認(rèn)參數(shù)
// 使用"="進(jìn)行賦值,但是賦值必須是編譯期的常量
getPerson3(name, {age = 25, gender = "Male"}) {
print("name=$name, age=$age, gender=$gender");
}
// 方法調(diào)用
getPerson3("Carson");
getPerson3("Carson", age:26);
getPerson3("Carson", age:27, gender:"Male");
// 方法重命名
Function func = printHello;
// 方法重命名之后的調(diào)用
func();
// 方法可以作為參數(shù)進(jìn)行傳遞
List getNewList(List list, String times(str)) {
for (var i = 0; i < list.length; i++) {
list[i] = times(list[i]);
}
return list;
}
String times(str) {
return str * 3;
}
var list = ["2","1","23","123","123"];
// 方法調(diào)用
print(getNewList(list,times));
// 匿名方法
// 可賦值給變量,通過變量進(jìn)行調(diào)用
// 可在其它方法中直接調(diào)用或者傳遞給其他方法
var funcA = () {
print("Hello");
};
// 方法調(diào)用
funcA();
// 方法調(diào)用
(() {
print("Hello2");
})();
// List與Map借助匿名函數(shù)進(jìn)行循環(huán)
var list2 = ["2","1","23","123","123"];
list2.forEach((item){
print(item);
});
var map2 = list2.asMap();
map2.forEach((key, value) {
print("key=$key, value=$value");
});
// 閉包
// 閉包是一個(gè)方法(對象)
// 閉包定義在其它方法內(nèi)部
// 閉包能夠訪問外部方法內(nèi)的局部變量,并持有其狀態(tài)
// 聲明方法并return出去
func1() {
int count = 0;
printCount() {
print(count++);
}
return printCount;
}
// 聲明匿名方法并進(jìn)行return
func2() {
int count = 0;
return () {
print(count--);
};
// 閉包的調(diào)用
var funct1 = func1();
funct1();
var funct2 = func2();
funct2();
