變量與類型
變量
類型 變量名 = 值;
如果一個(gè)變量在定義之后沒(méi)有賦值,則默認(rèn)等于null類型
基本類型 bool,num(int & double),String ,enum
泛型 List Mapvar
1.接受任何類型的變量
2.一旦賦值,無(wú)法改變類型是越,由此可看是一個(gè)強(qiáng)類型語(yǔ)言dynamic 與Object
Object | dynamic | |
---|---|---|
不同點(diǎn) | 只能使用Object屬性與方法 | 編譯器會(huì)提供所有可能的組合 |
相同點(diǎn) | 可以在后期改變賦值類型 | 可以在后期改變賦值類型 |
dynamic a = 'str';
print(a.length);//正確
Object a = 'str';
print(a.length);//錯(cuò)誤
dynamic 很容易引起運(yùn)行時(shí)錯(cuò)誤
左對(duì)齊 | 右對(duì)齊 | 居中對(duì)齊 |
---|---|---|
單元格 | 單元格 | 單元格 |
單元格 | 單元格 | 單元格 |
控制流語(yǔ)句
條件判斷
if 與其他語(yǔ)言差別不大
Debug模式下接受bool類型,Release接受任何類型(但是除了bool類型碌上,其他都判斷為false)
switch 語(yǔ)句
非空case在執(zhí)行完之后必須以break倚评、return浦徊、continue的方式結(jié)束
空case繼續(xù)執(zhí)行
循環(huán)語(yǔ)句
for 與其他語(yǔ)言差別不大
while 可以看做減緩版的for
do-white 先執(zhí)行一次,然后再判斷
跳轉(zhuǎn)語(yǔ)句
break 結(jié)束整個(gè)循環(huán)
continue 結(jié)束當(dāng)前循環(huán)
函數(shù)
聲明
沒(méi)有顯示聲明返回值類型默認(rèn)當(dāng)做dynamic
函數(shù)返回值沒(méi)有類型判斷
語(yǔ)法簡(jiǎn)寫
=> 表示函數(shù)變量
作為參數(shù)
void main() {
var calPower = (n) {
return n * n;
};
print(calPowder(5));
}
- 參數(shù)傳遞
- 層層傳遞
void main() {
printPower(calPower(8));
}
void printPowder(var power) {
print(power);
}
int calPower(int n) {
return n * n;
}
- 可選位置參數(shù)
- 可以用[]來(lái)標(biāo)記可選的參數(shù)位置
void main() {
int m1 = calMultiplication(4);
print(m1);//16
int m2 = calMultiplication(4,5);
print(m2);
}
int calMultiplication(int 1,[int 5]) {
if(b != null) {
return a * b;
}else {
return a * a;
}
}
- 可選命名參數(shù)
- 可以用 {} 來(lái)標(biāo)記可選的命名參數(shù)
void main() {
int m1 = calMultiplication(4);
print(m1);//16
int m2 = calMultiplication(4,b: 5);
print(m2);
}
int calMultiplication(int 1,[int 5]) {
if(b != null) {
return a * b;
}else {
return a * a;
}
}
類和對(duì)象
- 定義
- class
- 構(gòu)造函數(shù)
- 與類同名
class Person {
int age;
String name;
Person(int age, String name) {
this.age = age;
this.name = name;
}
int howOld() {
return age;
}
- 空的構(gòu)造函數(shù)
class Person {
int age;
String name;
int howOld() {
reutrn age;
}
}
沒(méi)有析構(gòu)函數(shù) => 垃圾回收
命名構(gòu)造函數(shù)
更加方便
class Person {
int age;
String name;
Person(this.age,this.name);
Person.fromList(List<dynamic>list) {
age = list[0]
name = list[1]
}
int howOld() {
return age;
}
}
void main() {
Person a = new Person(20,'小A');
print(a.howOld());
Person b = new Person.fromList([30,'小B']);
print(b.howOld());
}
繼承與多態(tài)
- 繼承
- 繼承一個(gè)基類: extends
- 調(diào)用基類方法: super
- 多態(tài)
- 沒(méi)有很大差別
class Person {
int age;
String name;
Person(this.age,this.name);
Person.fromList(List<dynamic>list) {
age = list[0]
name = list[1]
}
int howOld() {
return age;
}
}
class Male extends Person {
Male(int age, String name) : super(age,name);
@override
int howOld() {
return age + 1;
}
}
void main() {
Person a = new Person(20,'小A');
print(a.howOld());
Person b = new Person.fromList([30,'小B']);
print(b.howOld());
Person c = new Male(20,'小C');
print(c.howOld());
}
抽象類與接口
- 抽象類
- 關(guān)鍵字: abstract
- 不能實(shí)例化
- 抽象函數(shù): 聲明但不實(shí)現(xiàn)
- 派生類必須重寫抽象類所有的抽象函數(shù)
abstract class Person {
String getName();
int getAge() {
return 20;
}
}
class Male extends Person {
String getName() {
return '小A'天梧;
}
}
void main() {
Person a = new Person();
Person b = new Male();
print(b.getName());
}
- 接口
- 關(guān)鍵字: implements
- Dart每個(gè)類都是接口
- 必須實(shí)現(xiàn)構(gòu)造函數(shù)外所有的成員函數(shù)
abstract class Person {
String getName();
int getAge() {
return 20;
}
}
class Male extends Person {
String getName() {
return '小A';
}
}
class AA implements Male {
@override
int getAge() {
return 20;
}
@override
String getName() {
return 'AA';
}
}
靜態(tài)與權(quán)限
- 靜態(tài)與非靜態(tài)的成員盔性、成員函數(shù)
靜態(tài) | 非靜態(tài) | |
---|---|---|
修飾 | 無(wú) | static |
屬于 | 對(duì)象 | 類 |
訪問(wèn) | 成員、靜態(tài)成員呢岗、成員函數(shù)勉抓、靜態(tài)成員函數(shù) | 只能訪問(wèn)靜態(tài)成員和靜態(tài)成員函數(shù) |
- 權(quán)限
- 無(wú)關(guān)鍵字
- 使用符號(hào)"_" 標(biāo)識(shí)權(quán)限
- 不存在針對(duì)類的訪問(wèn)權(quán)限汉形,只有針對(duì)包(package) 的
異步支持
- Future + async + await
異步運(yùn)算async -> 延遲隊(duì)列(await) -> 等待結(jié)果(Future)
- 簡(jiǎn)介一個(gè)異步支持
- async 與 await(await 關(guān)鍵字必須在async函數(shù)內(nèi)部使用)
void main() {
String data = '初始化data';
getData(data);
}
getData(String data) async {
print(data); //初始化data
data = await Future.delayed(Duration(seconds: 2),() {
return '網(wǎng)絡(luò)數(shù)據(jù)';
}) as String;
print(data);//網(wǎng)絡(luò)數(shù)據(jù)
}
- Future
- 表示異步操作的最終完成(或失敗)
- 只會(huì)有一個(gè)結(jié)果
- 返回值仍然是Future類型
Future.then
void main() {
Future<String> future = getData();
future.then((data) {
print(data);
});
}
Future<String> getData() async {
return await Future.delayed(Duration(seconds: 2),() {
return '網(wǎng)絡(luò)數(shù)據(jù)';
});
}
- 異常錯(cuò)誤
void main() {
Future<String> future = getData();
future.then((data) {
print(data);
}).catchError((e) {
print(e);
});
}
Future<String> getData() async {
return await Future.delayed(Duration(seconds: 2),() {
throw AssertionError("Error");
});
}
void main() {
Future<String> future = getData();
future.then((data) {
print(data);
},onError: (e) {
print(e);
});
}
Future<String> getData() async {
return await Future.delayed(Duration(seconds: 2),() {
throw AssertionError("Error");
});
}
Future.whenComplete
標(biāo)識(shí)無(wú)論成功或者失敗枪汪,都會(huì)調(diào)用
Future.wait
等待多個(gè)異步執(zhí)行任務(wù)執(zhí)行結(jié)束后再執(zhí)行
接受一個(gè)Future數(shù)組參數(shù)
void main() {
Future.wait([
Future.delayed(new Duration(seconds: 2),() {
return "hellow";
}),
Future.delayed(new Duration(seconds: 2),() {
return " worrld";
})
]).then((reuslts) {
print(reuslts[0] + reuslts[1]);
}).catchError((e) {
print(e);
});
}
文檔學(xué)習(xí)
- 語(yǔ)法概覽
語(yǔ)法概覽 - 博客
簡(jiǎn)書博客