一站蝠、dart基本介紹
Dart是由谷歌開(kāi)發(fā)的計(jì)算機(jī)編程語(yǔ)言,它可以被用于web揽祥、服務(wù)器、移動(dòng)應(yīng)用 和物聯(lián)網(wǎng)等領(lǐng)域的開(kāi)發(fā)桨醋。
Dart誕生于2011年棚瘟,號(hào)稱要取代JavaScript。但是過(guò)去的幾年中一直不溫不火喜最。直到Flutter的出現(xiàn)現(xiàn)在被人們重新重視偎蘸。要學(xué)Flutter的話我們必須首先得會(huì)Dart。
二瞬内、程序執(zhí)行過(guò)程
//helloword.dart
main(List<String> args) {
print('Hello World');
}
一迷雪、Dart語(yǔ)言的入口也是main函數(shù),并且必須顯示的進(jìn)行定義虫蝶;
二章咧、Dart的入口函數(shù)main是沒(méi)有返回值的;
三秉扑、傳遞給main的命令行參數(shù)慧邮,是通過(guò)List<String>完成的。從字面值就可以理解List是Dart中的集合類型舟陆。其中的每一個(gè)String都表示傳遞給main的一個(gè)參數(shù)误澳;
四、定義字符串的時(shí)候秦躯,可以使用單引號(hào)或雙引號(hào)忆谓;
五、語(yǔ)句必須使用分號(hào)結(jié)尾(JavaScript不用)踱承;
三倡缠、變量
變量必須按照如下方式聲明:變量類型 變量名稱 = 賦值;
注意:var name= "123";不是一種明確聲明,他是在編譯中使用類型推導(dǎo)
注意:dynamic name= "123";相當(dāng)于TypeScript
特點(diǎn):
?1. 變量強(qiáng)類型茎活,只可修改昙沦,類型不可修改。
?2. const在賦值時(shí), 賦值的內(nèi)容必須是在編譯期間就確定下來(lái)的final在賦值時(shí), 可以動(dòng)態(tài)獲取, 比如賦值一個(gè)函數(shù)载荔,其次, final一旦被賦值后就有確定的結(jié)果, 不會(huì)再次賦值
String getName() {
return 'coderwhy';
}
const name1 = getName(); // 錯(cuò)誤的做法, 因?yàn)橐獔?zhí)行函數(shù)才能獲取到值
final name2 = getName(); // 正確的做法
四盾饮、數(shù)據(jù)類型
- 數(shù)值型 int,double。(整數(shù)用int懒熙,浮點(diǎn)數(shù)用double)
- 布爾型 (注意if判斷時(shí)不像js遵行非0或非空為真)
- dynamic丘损,使用dynamic來(lái)聲明的變量,可以改變變量類型工扎。
dynamic name = "123";
name = 0 ; - 字符串類型徘钥。
var s = '中'; - 集合類型:Dart則內(nèi)置了最常用的三種:List / Set / Map。
List 數(shù)組(與javascript的數(shù)組類似肢娘,但自動(dòng)識(shí)別數(shù)組中元素類型呈础,保證類型的一致性舆驶。)
List定義:
// 1.使用類型推導(dǎo)定義
var letters = ['b', 'c', 'd', 'a'];
// 2.明確指定類型
List<int> numbers = [1, 2, 3, 4];
List常用函數(shù):
list1.add('white'); //add添加新元素
list1.length; //獲取集合的長(zhǎng)度
list1.insert(1, 'black'); //在集合指定index位置插入指定的元素
list1.removeAt(2); //移除集合指定的index=2的元素
list1.sublist(1, 3); //截取子集合
list1.getRange(1, 3); //獲取集合中某個(gè)范圍元素,截取之后不是list
list1.join('<--->'); //輸出: red<--->yellow<--->blue<--->green
list1.isEmpty; //判斷數(shù)組非空 true,false
list1.contains('green'); //判斷數(shù)組是否含有某個(gè)元素
list1.clear(); //清除所有元素
Set: 集合Set和列表List的區(qū)別在于 集合中的元素是不能重復(fù) 的猪落。所以添加重復(fù)的元素時(shí)會(huì)返回false,表示添加不成功.
Set定義:
Set常用函數(shù)(強(qiáng)調(diào) 交集贞远,并集畴博,補(bǔ)集):
var colorSet1 = {'red', 'yellow', 'blue', 'green'};
var colorSet2 = {'black', 'yellow', 'blue', 'green', 'white'};
print( colorSet1.intersection(colorSet2) ); //交集-->輸出: {'yellow', 'blue', 'green'}
print( colorSet1.union(colorSet2) ); //并集--->輸出: {'black', 'red', 'yellow', 'blue', 'green', 'white'}
print( colorSet1.difference(colorSet2) ); //補(bǔ)集--->輸出: {'red'}
print( colorSet2.difference(colorSet1) ); //補(bǔ)集--->輸出: {black, white}
Set數(shù)組遍歷和List遍歷一樣笨忌。
Map
// 1.使用類型推導(dǎo)定義
var infoMap1 = {'name': 'why', 'age': 18};
// 2.明確指定類型
Map<String, Object> infoMap2 = {'height': 1.88, 'address': '北京市'};
Map<String, int> colorMap = {'white': 0xffffffff, 'black':0xff000000};
print(colorMap.containsKey('green')); //false 判斷是否含有某個(gè)key
print(colorMap.containsValue(0xff000000)); //true 判斷是否含有某個(gè)value
print(colorMap.keys.toList()); //取Key成數(shù)組 ['white','black']
print(colorMap.values.toList()); //取value成數(shù)組 [0xffffffff, 0xff000000]
colorMap['white'] = 0xfffff000; //修改指定key的元素
colorMap.remove('black'); //移除指定key的元素
五、流程控制
//循環(huán)
List<int> listFor = [1, 2, 3, 4, 5];
for (var i = 0; i < listFor.length; i++) {
print(listFor[i]);
}
var j = 0;
while (j < listFor.length) {
print(listFor[j++]);
}
var index = 0;
do {
print(listFor[index]);
index++;
} while (index < listFor.length);
// if-else 和js一樣俱病,但判斷時(shí)必須以返回值true,false官疲,null,0,undefined等不能識(shí)別
//三目運(yùn)算符(? : )和js一樣
//switch-case 和js一樣
Assert(斷言) ---------目前還不了解
在dart中如果條件表達(dá)式結(jié)果不滿足條件亮隙,則可以使用 assert 語(yǔ)句中斷代碼的執(zhí)行途凫。特別是在Flutter源碼中隨處可見(jiàn)都是assert斷言的使用。注意: 斷言只在檢查模式下運(yùn)行有效溢吻,如果在生產(chǎn)模式運(yùn)行维费,則斷言不會(huì)執(zhí)行。
assert(text != null);//text為null,就會(huì)中斷后續(xù)代碼執(zhí)行
assert(urlString.startsWith('https'));
五促王、異常捕獲
dart中的異常捕獲方法和Java,Kotlin類似犀盟,使用的也是try-catch-finally; 對(duì)特定異常的捕獲使用on關(guān)鍵字. dart中的常見(jiàn)異常有: NoSuchMethodError(當(dāng)在一個(gè)對(duì)象上調(diào)用一個(gè)該對(duì)象沒(méi)有 實(shí)現(xiàn)的函數(shù)會(huì)拋出該錯(cuò)誤)、ArgumentError (調(diào)用函數(shù)的參數(shù)不合法會(huì)拋出這個(gè)錯(cuò)誤)
int num = 18;
int result = 0;
try {
result = num ~/ 0;
} catch (e) {//捕獲到IntegerDivisionByZeroException
print(e.toString());
} finally {
print('$result');
}
六蝇狼、函數(shù)
1.函數(shù)都必須有返回值阅畴,如果沒(méi)有的話,那將自動(dòng)返回null;
2.匿名函數(shù);
colorSet1.forEach((item) {
print(item);
});
(item) {
print(item);
}這個(gè)就是匿名函數(shù)
3.dart 的函數(shù)和js一樣迅耘,可以給變量賦值贱枣,成函數(shù)表達(dá)式 var myFunc = closureFunc();
4.dart 也有閉包(子函數(shù)訪問(wèn)父函數(shù)的變量)
5.A函數(shù)作為B函數(shù)的參數(shù)
注意:因?yàn)楹瘮?shù)必須指定返回值類型和參數(shù)的類型,所以在定義B()時(shí)必須指明A的參數(shù)形式颤专。
6.不像java中有函數(shù)重載纽哥,但可以設(shè)置函數(shù)參數(shù)的可選還是必填
必填參數(shù):和java一樣
可選參數(shù)分為兩種:位置可選、命名可選
位置可選:[],通過(guò)位置確定從左到右排列栖秕,只能選擇不要最后(只能選擇保留一一對(duì)應(yīng)得參數(shù)關(guān)系)春塌,不能跳過(guò)一位輸后面的參數(shù)
命名可選:{}, 通過(guò)key:value任意輸入?yún)?shù)
main(List<String> args) {
// 1.將函數(shù)賦值給一個(gè)變量
var bar = foo;
print(bar);
// 2.將函數(shù)作為另一個(gè)函數(shù)的參數(shù)
test(foo);
// 3.將函數(shù)作為另一個(gè)函數(shù)的返回值
var func =getFunc();
func('kobe');
}
// 1.定義一個(gè)函數(shù)
foo(String name) {
print('傳入的name:$name');
}
// 2.將函數(shù)作為另外一個(gè)函數(shù)的參數(shù)
test(Function func) {
func('coderwhy');
}
// 3.將函數(shù)作為另一個(gè)函數(shù)的返回值
getFunc() {
return foo;
}
不能在main 中定義:
void func1(String name, [int x = 0, int y = 0]) {
print(name);
if (x != 0) {
print(x);
}
if (y != 0) {
print(y);
}
}
void func2(String name, {int x = 0, int y = 0}) {
print(name);
if (x != 0) {
print(x);
}
if (y != 0) {
print(y);
}
}
七累魔、類 (待完善)
1.默認(rèn)所有的類都繼承自object類
八摔笤、常用運(yùn)算
級(jí)聯(lián)運(yùn)算符:對(duì)一個(gè)對(duì)象連續(xù)操作時(shí),用..代替類名.
final p1 = Person();
p1.name = 'why';
p1.run();
p1.eat();
p1.swim();
替換如下:
final p2 = Person()
..name = "why"
..run()
..eat()
..swim();
?? = 賦值操作
var a = null;
var b = a ?? 3;//A ?? B 的作用:如果A
print(b);