Dart2基礎
阿新 • • 發佈:2018-11-01
資料型別
變數與常量
var
使用var宣告變數,可賦予不同型別的值
未初始化時,預設值為null
final
使用final宣告一個只能賦值一次的變數
const
使用const宣告的必須是編譯期常量
內建型別
數值型-Number、字串-String、布林型-Boolean、列表-List、鍵值對-Map、Runes、Symbols
數值型-Number
使用關鍵字num來表示,分為兩種: 整形int 浮點型 double
int、double都繼承於num
-
數值型操作
運算子
+(加)、-(減)、*(乘)、/(除)、~/(取整)、%(取餘)
常用屬性
isNaN(是否為非數字)、isEven(是為偶數)、isOdd(是否為奇數)等
常用方法:
取絕對值abs()、round()四捨五入、取不大於它的最大整數floor()、取不小於它的最小整數ceil()、轉為整形toInt()、轉為浮點型toDouble()
字串 字串-String
使用單引號、雙引號建立字串;
使用三個引號或雙引號建立多行字串;
使用r建立原始raw字串(即使有轉義字元也會被打印出來,例如:r'Hello \n Dart',打印出來的就是Hello \n Dart,不會轉義換行)
運算子
+(和java一樣)、*(和Python一樣,例如"new"*4,就是複製4次,即: new new new new)、==(比較內容是否相等)、[](取字元,下標從0) 插值表示式:${expression}
int a=1;
int b=2;
print("a+b=${a+b}");
print("a=$a");
輸出為:a+b=3
a=1
常用屬性
length、isEmpty、isNotEmpty和java相同
**常用方法 **
contains()、subString()、startsWith()、endsWith()、indexOf()、lastIndexOf()、toLawerCase()、 toUpperCase()、trim()、split()和java相同 trimLeft()將字串最前面的空格修整掉、trimRight()消除從右側起所遇到的所有空格字元 replaceXXX()
布林型
- 使用bool表示布林型別
- 布林值只有true和false
列表(陣列)–List
dart中列表和陣列是同一個
建立
- 建立List: var list=[1,2,3];
- 建立不可變的List:var list=const[1,2,3];
- 構造建立:var list=new List();
常用操作(同Java)
- [],length
- add(),insert()
- remove(),clear()
- indexOf(),lastIndexOf()
- sort(),sublist()
- shuffle(),asMap(),列表for迴圈forEach()
Map
建立
- 建立Map:
var language={‘first’:‘Dart’,‘second’:‘Java’}; - 建立不可變Map:
var language=const{‘first’:‘Dart’,‘second’:Java};
常用操作(同Java)
- [],length
- isEmpty(),isNotEmpty()
- Keys,values
- 是否包含某個key:containsKey(),是否包含某個value:containsValue()
- remove()
- forEach()
例如:
mapforEach(f);
void f(key,value){
print("key"=$key,value=$value);
}
dynamic關鍵字
多種不同型別
運算子
算術運算子
- 加減乘除:
+(加)、-(減)、*(乘)、/(除)、~/(取整)、%(取餘)
- 遞增遞減:
++var,var++,--var,var--
關係運算符
- 運算子:==,!=,>,<,>=,<=
- 判斷內容是否相同使用==
邏輯運算子(同java)
- 運算子:!,&&,||
- 針對布林型別運算
bool isTrue=true;
bool isFalse=false;
print(isTrue && isFalse);
print(isTrue || isFalse);
輸出:
false
true
賦值運算子
- 基礎運算子:=,??=(如運算子左邊是空的就取符號右邊的值,如果不為空就取自己的值)
int a=10;
int b;
b ??=a;
print(b);
輸出:10
int a=10;
int b=5;
b ??=a;
print(b);
輸出:5
- 複合運算子:+=,-=,*=,/=,%=,~/= (類似於java)
條件表示式
- 三目運算子:condition ? expr1 : expr2 (與java相同,condition 為true取expr1,condition為false取expr2)
- ??運算子:expr1 ?? expr2 (如果第一個表示式為空,取第二個表示式的值,如果第一個表示式不為空,取第一個表示式的值)
控制語句 (同java)
if語句
- if語句
- if…else if語句
- if…else if…else語句
for語句
- for 迴圈
- for…in迴圈 (和js相同)
for(var item in list){
print(item);
}
while語句
- while迴圈
- do…while迴圈
break和continue
- 終止迴圈:break
- 跳出當前迴圈continue
switch…case語句
- 比較型別:num,String,編譯期常量,物件,列舉
- 非空case必須要有個break
- default處理預設情況
- continue跳轉標籤
方法
方法定義
返回型別 方法名(引數1,引數2,....){
方法體...
return 返回值
}
可選引數
- 可選命名引數:{param1,param2,…}
- 可選位置引數: [param1,param2,…]
- 如果存在具體引數,可選引數生命,必須在具體引數後面
void main(){
printPerSon("老王");
printPerSon("刑天",age:4000);
printPerSon("老張",age: 40,gender: "男");
printPerSon2("漢斯");
printPerSon2("馬飛",23);
printPerSon2("劉芳",22,"女");
}
/**
* 具體引數必須放在可選引數前
*/
printPerSon(String name,{int age,String gender}){
print("name=$name,age=$age,gender=$gender");
}
/**
* 具體引數必須放在可選引數前
*/
printPerSon2(String name,[int age,String gender]){
print("printPerSon2==>name=$name,age=$age,gender=$gender");
}
輸出:
name=老王,age=null,gender=null
name=刑天,age=4000,gender=null
name=老張,age=40,gender=男
printPerSon2==>name=漢斯,age=null,gender=null
printPerSon2==>name=馬飛,age=23,gender=null
printPerSon2==>name=劉芳,age=22,gender=女
預設引數值
- 使用=在可選引數指定預設值
void main(){
printPerSon("老王");
printPerSon("刑天",age:4000);
printPerSon("老張",age: 40,gender: "男");
}
printPerSon(String name,{int age=24,String gender="男"}){
print("name=$name,age=$age,gender=$gender");
}
輸出:
name=老王,age=24,gender=男
name=刑天,age=4000,gender=男
name=老張,age=40,gender=男
方法物件
- 方法可作為物件賦值給其他變數
- 方法可作為引數傳遞給其他方法
void main(){
//方法作為物件賦值給其他變數
Function func= printHello;
func();
var list=[1,2,3,4];
//方法作為引數傳遞給其他方法 print 與 forEach
list.forEach(print);
var list2=["h","e","l","l","o"];
//方法作為引數傳遞給其他方法 times 與 listTiemes
print(listTiemes(list2, times));
}
void printHello(){
print("Hello");
}
/**
* 方法作為引數傳遞給其他方法
*/
List listTiemes(List list,String fun(str)){
for(var index = 0;index<list.length;index++){
list [index]=fun(list[index]);
}
return list;
}
String times(str){
return str*3;
}
輸出:
Hello
1
2
3
4
[hhh, eee, lll, lll, ooo]
匿名方法
定義
(引數1,引數2,...){
方法體...
return 返回值
}
匿名方法特性
- 可賦值給變數,通過變數進行呼叫
void main(){
var func=(str){
print("匿名方法輸出==>$str");
};
func(20);
// //也可以不傳遞給變數呼叫匿名方法,但不建議使用,不方便閱讀
// ((){
// print("Test");
// })();
}
輸出:匿名方法輸出==>20
- 可在其他方法中直接呼叫或傳遞給其他方法
void main(){
var list2=["h","e","l","l","o"];
//匿名方法作為一個引數給給其他方法呼叫
print(listTiemes(list2, (str){
return str*3;
}));
}
/**
* 方法作為引數傳遞給其他方法
*/
List listTiemes(List list,String fun(str)){
for(var index = 0;index<list.length;index++){
list [index]=fun(list[index]);
}
return list;
}
輸出:[hhh, eee, lll, lll, ooo]
閉包
- 閉包是一個方法(物件)
- 閉包定義在其他方法內部
- 閉包能夠訪問外包方法內的區域性變數,並持有其狀態
void main(){
var func = a();
func();
func();
func();
func();
}
a(){
int count=0;
// printCount(){
// print(count++);
// }
// return printCount;
//使用匿名方法
return (){
print(count++);
};
}
輸出:
0
1
2
3
其他
擴充套件類
使用with關鍵字後面跟著一個或多個擴充套件類名
class Musician extends Performer with Mnsical {
// ...
}
class Maestro extends Person with Musical, Aggressive, Demented {
Maestro(String maestroName) {
name = maestroName;
canConduct = true;
}
}
要實現擴充套件類,建立一個沒有建構函式,沒有父類呼叫的類
abstract class Musical {
bool canPlayPiano = false;
bool canCompose = false;
bool canConduct = false;
void entertainMe() {
if (canPlayPiano) {
print('Playing piano');
} else if (canConduct) {
print('Waving hands');
} else {
print('Humming to self');
}
}
}