1. 程式人生 > >Dart2基礎

Dart2基礎

資料型別

變數與常量

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');
        }
    }
}