Flutter之旅:Dart的基礎語法

1.Dart中常見數據類型一覽:

總的來看Dart的常見的數據類型有下面8種:數組

1.1.數字類型

num、int和double都是Dart中的類,也就是說它是對象級別的,因此他們的默認值爲null。這不一樣於Java的基本數據類型。微信

main(){
  num age = 18;//num數據類型
  int height =180;//int整型
  double weight=62.5;//double 浮點型

  print(height/weight is double);//true
  print(height*age is double);//false
  print(age/height is double);//true
}
複製代碼

##### 1.2.布爾類型
複製代碼

布爾類型做爲判斷的標識,活躍在各大語言中的邏輯判斷中,它只有true和false兩種選擇。這裏注意關鍵字是bool,而非Java中的booleanmarkdown

bool isMan = true;
bool isMarried = false;
複製代碼

1.3.字符串類型

字符串是一種語言不可或缺的部分,Dart也不例外。它支持單引號、雙引號、以及三引號。須要注意的是單引號中的單引號須要轉義,三引號中的字符內容會原樣輸出。函數

String name = '張風捷特烈';//支持單引號
  String proverbs ="'海的彼岸有我不曾見證的風采'";//支持雙引號
  String poem=""" //支持三引號
>《零境》
    ----張風捷特烈
飄縹兮飛煙浮定,
渺緲兮皓月風清。
紛紛兮初心復始,
繁繁兮萬緒歸零。
     2017.11.7 改  <br/>
  """;
  print('${name}\n$proverbs\n$poem');//支持字符串中使用變量
複製代碼


1.4.列表類型

List做爲一個同類多元素的容器,也是每種語言必備。Dart中的List做爲一個類存在,能夠當作可操做的數組來對待,起始索引爲0。其餘語言中對於數組的操做,Dart中基本都有相關的API。post

List<String> languages = ['Java', 'Dart', 'Python', 'C++', 'Kotlin'];
print(languages[0]); //Java
languages.add("JavaScript");//添加元素
複製代碼

1.5.集合類型

Set做爲一個盛放不含重複元素的無序多元素容器,若是添加一個已經存在的元素,是沒法添加成功的。因此它沒有索引。但有不少方法能夠對集合進行操做編碼

Set<String> languages = {'Java', 'Dart', 'Python', 'C++', 'Kotlin',"Java"};
print(languages);//{Java, Dart, Python, C++, Kotlin}
print(languages.add('Java'));//false
print(languages.add('JavaScript'));//true
複製代碼

1.6.Map類型

Map爲若干個鍵值對的容器,想用映射之名。其中一個Map對象中的鍵不能重複,值是能夠重複的。lua

Map<int, String> map = {1: 'one', 2: 'two', 3: 'three'};
print(map[3]);//three
map[4] = 'four';
print(map.length);//4
複製代碼

1.7.Runes

這是一個Dart中的新名詞,首先看他的地位:它是一個類,繼承自Iterable<int>,也就是說它是一個可比遍歷的int型元素組合體。spa

在String類源碼的第一行有這麼一句話:A sequence of UTF-16 code units.說明Dart中字符串的編碼是UTF-16,查看一個字符串的UTF-16能夠用xxx.codeUnits,能夠得到一個int數組。code

String dart ="Dart";
print(dart.codeUnits);//[68, 97, 114, 116]
複製代碼

看一個惡魔的emoji 👿,對應的Unicode爲\u{1f47f},看一下他的UTF-16碼orm

var evil = '\u{1f47f}';
  print(evil);//👿
  print(evil.codeUnits);//[55357, 56447]
複製代碼

經過xxx.runes方法,能夠得到一個Runes對象,能夠看出一個emoji是和一個Runes元素對應的,而不像UTF-16須要兩個碼聯合起來才能夠表示。這就有一個好處:咱們能夠將emoji當作可迭代的元素進行處理。

var evil = '\u{1f47f}\u{1f47a}\u{1f47b}';
  print(evil);//👿👺👻
  print(evil.codeUnits);//[55357, 56447, 55357, 56442, 55357, 56443]
  print(evil.runes);//(128127, 128122, 128123)
複製代碼

好比對Runes中的元素作個map操做

Runes input = Runes('\u2695\u{1f47a}\u{1f34b}\u2653\u{1f46d}\u{1f34e}\u2694\u{1f470}\u{1f349}');
  print(input);//(9877, 128127, 127823, 9861, 128111, 127823, 9877, 128127, 127823)
  print(String.fromCharCodes(input));//⚕👺🍋♓👭🍎⚔👰🍉
  print(String.fromCharCodes(input.map((e){
   return e-5;
  })));//⚐👵🍆♎👨🍉⚏👫🍄
複製代碼

1.8.Symbols

首先毋庸置疑Symbols也是一個類,從名稱上來看是一個標誌,用起來也比較特殊。

總的來講它能夠標識出一個字符串,而後經過MirrorSystem.getName來獲取到。好處是這個標誌字符串沒法磨滅,即便混淆了代碼,也能夠得到。
通常用於反射時類名的處理,可是Flutter中是禁止用反射的,因此沒有dart:mirrors包。這個瞭解一下,看到認識便可。

Symbol className = #Person;
  print(className);//Symbol("Person") 
  MirrorSystem.getName(className);
複製代碼

關於具體的API操做,這裏就不作過多闡述,整體來講和主流語言都是一致的,之後再代碼中用到也會提一下。


2.Dart中的變量與常量

Dart 做爲一名新時代的後起之秀,var天然不能少。Dart語言中對象的類型是能夠自動推導的。也就是說,上面的代碼在聲明變量類型時,均可以用一個var關鍵字解決。

2.1:var關鍵字的使用
var age = 18;
var isMan = true;
var name = '張風捷特烈';
var languages = ['Java', 'Dart', 'Python', 'C++', 'Kotlin'];
var languages2 = {'Java', 'Dart', 'Python', 'C++', 'Kotlin',"Java"};
var map = {1: 'one', 2: 'two', 3: 'three'};
var className = #Person;
複製代碼
2.2:var的注意點

若是隻是用var聲明變量,該變量以後是能夠修改數據類型的

var who;
who="what";
print(who is String);//true
who=10;
print(who is int);//true
複製代碼

若是聲明的同時取賦值,那麼該對象的類型就是固定的,不可修改

var who="what";
print(who is String);//true
who=10;//此處報錯
print(who is int);//true
複製代碼

下面一幅圖能夠很好地說明緣由:未賦值是,var聲明的變量類型爲dynamic(動態的),dynamic也是一個關鍵字

dynamic d = 20;
複製代碼


2.3:常量的定義

若是一個變量你之後不打算修改,可使用 final 或者 const進行修飾,當你試圖修改它的值,就會報錯。

final PI = 3.14159265;
  PI=4;// ERROR: 'PI', a final variable, can only be set once.

  const Pi  = 3.14159265;
  Pi=4;// ERROR: Constant variables can't be assigned a value.
複製代碼

2.4:const和final的區別

一個 final 變量只能賦值一次:它的值能夠在運行時獲取

一個 const 變量是編譯時常量:碼尚未運行時咱們就知道它聲明變量的值
以下,一樣是當前時間,final修飾的f對象是正確的,但const修飾的c是錯誤的,緣由是final能夠在運行時對變量初始化,但const不行。

final f = DateTime.now(); // OK
const c = DateTime.now(); // ERROR Const variables must be initialized with a constant value.
複製代碼

3.運算符

常見運算符一覽

3.1:算術運算符

四則運算

print(1 + 2);//3    加
print(1 - 2);//-1   減
print(1 * 2);//2    乘
print(1 / 2);//0.5  除
print(10 % 3);//1   餘
print(10 ~/ 3);//3  商
複製代碼

自加自減

---->[狀況1:i++]----
int i=3;
var a=i++;//執行賦值後i才自加,故a=3
print('a=$a,i=$i');//a=3,i=4

---->[狀況2:++i]----
int i=3;
var a=++i;//執行賦值前i已經自加,故a=4
print('a=$a,i=$i');//a=4,i=4

---->[狀況3:i--]----
int i=3;
var a=i--;//執行賦值後i才自減,故a=3
print('a=$a,i=$i');//a=3,i=2

---->[狀況4:--i]----
int i=3;
var a=--i;//執行賦值前i已經自減,故a=2
print('a=$a,i=$i');//a=2,i=2
複製代碼

3.2:關係運算符

print(1 > 2); //false   大於
print(1 < 2); //true    小於
print(1 == 2); //false  等於
print(1 != 2); //true   不等
print(10 >= 3); //true  大於等於
print(10 <= 3); //false 小於等於
複製代碼

3.3:位運算符

拿兩個數來講明一下位運算:a=1705和b=17589

位與:&  兩個都是1爲1    位或:|     只要有1就是1
位非:~  全取反          位都不同爲1
左位移:<<              右位移:>>

例子:c = a & b 
    0000 0000 0000 0000 0000 0110 1010 1001  [a]   0x000006a9  1705
 &  0000 0000 0000 0000 0100 0100 1011 0101  [b]   0x000044b5  17589
---------------------------    
    0000 0000 0000 0000 0000 0100 1010 0001  [c]   0x000004a1  1185
    
例子:d = a | b
    0000 0000 0000 0000 0000 0110 1010 1001  [a]   0x000006a9  1705
 |  0000 0000 0000 0000 0100 0100 1011 0101  [b]   0x000044b5  17589
---------------------------
    0000 0000 0000 0000 0100 0110 1011 1101  [d]   0x000046bd  18109
    
例子:e = ~a    
    0000 0000 0000 0000 0000 0110 1010 1001  [a]   0x000006a9  1705
  ~  
    1111 1111 1111 1111 1111 1001 0101 0110  [e]   0xfffff956  -1706

例子:f = a ^ b
    0000 0000 0000 0000 0000 0110 1010 1001  [a]   0x000006a9  1705
 ^  0000 0000 0000 0000 0100 0100 1011 0101  [b]   0x000044b5  17589
---------------------------
    0000 0000 0000 0000 0100 0010 0001 1100  [f]   0x0000421c  16924

例子:g = a << 4  
         0000 0000 0000 0000 0000 0110 1010 1001  [a]   0x000006a9  1705
    0000 0000 0000 0000 0000 0110 1010 1001  <---移位
         0000 0000 0000 0000 0110 1010 1001 0000  [g]   0x00006a90  27280=1705*2^4
         
例子:h = a >> 4  
         0000 0000 0000 0000 0000 0110 1010 1001  [a]   0x000006a9  1705
              0000 0000 0000 0000 0000 0110 1010 1001  <---移位
         0000 0000 0000 0000 0000 0000 0110 1010  [g]   0x0000006a  27280=106
複製代碼

3.4:邏輯運算符

下面的代碼表示:年齡大於22或者身高大於160的女性能夠進入。

bool enter(int age, int height, bool isMan) {
  return (age > 18 || height > 160) && !isMan;
}
複製代碼
3.5:賦值運算符

上圖中的下面一行都是運算符和等號的組合,其中

a += b 等價於 a = a + b
複製代碼

其餘運算符依此類推,這裏主要講一下比較特別??=,當變量的值爲null時,執行賦值語句,不然不賦值

---->[狀況1:b值爲null]----
  var a = 20;
  var b;
  b ??= a;
  print(b);//20

---->[狀況2:b值不爲null]----
  var a = 20;
  var b = 2;
  b ??= a;
  print(b);//2
複製代碼

3.6:條件表達式

三元運算符:條件成立執行前者,不然,執行後者

var height =130;
var pay = (height>120) ? 200:100;
print(pay);//200
複製代碼

??運算符:前表達式值爲null則取後者。不然,後表達式不會被執行

---->[狀況1:b值爲null]----
var a = 20;
var b;
var c=b ?? a++;
print('a=$a,c=$c');//a=21,c=20

---->[狀況1:b值爲null]----
var a = 20;
var b = 2;
var c = b ?? a++;
print('a=$a,c=$c'); //a=20,c=2
複製代碼

4.Dart中的函數

Dart中,一個函數的基本組成以下:

4.1:基本使用

兩個數相加

double add(double a,double b){
  return a+b;
}
調用:add(10,20);//30
複製代碼

4.2:可選參數+默認值

兩個數相加,而且能夠打個折扣

double add(double a,double b,[double discount=1.0]){
  return (a+b)*discount;
}
調用:add(10,20,0.7);//21
複製代碼

4.3:屬性型參數

將參數和一個key對應起來,很是方便和清晰的傳參模式

double add(double a,double b,{double discount=1.0,double c=0,double d =0}){
  return (a+b+c+d)*discount;
}
調用:add(10, 20,discount: 0.7,c: 100);//91.0
複製代碼

4.4:函數參數

值得一說的是,函數自己也是一個對象,能夠做爲參數傳入。

double add(double a,double b,deal){
  return deal(a)+deal(b);
}

調用:
var fun = (double i) {
  return i * i;
};
print(add(3, 4, fun));//求兩數的平方和
複製代碼

4.5:函數簡寫
var fun = (double i) {
  return i * i;
};

能夠簡寫爲:
var fun = (i) {
  return i * i;
};

進一步能夠簡寫爲:
var fun = (i)=> i * i;
複製代碼

這樣的話,初始代碼的開始應該能看懂了吧

void main() => runApp(MyApp());

它至關於:
void main() {
  return runApp(MyApp());
}
複製代碼

5.Dart 流程控制

老生常談了,寫個方法示意一下。

5.1: if...else

if(進入條件){執行體}else{執行體}

double sale(height) {
  if(height<=0){//if能夠單獨使用
    return 0;
  }
  
  var price = 100;//票價
  var disCount = 1.0;//折扣
  
  if (height > 140) {//if能夠結合else if使用
    disCount=0;//身高140下免費
  }else if(height<160){
    disCount=0.7;//身高160下七折
  }
  return price * disCount;
}
複製代碼

5.2:for循環

for(初始變量;退出條件;每次循環執行完變量的操做){執行體}

for(var count=0;count<10;count++){
  print("count:$count");
}
複製代碼

5.3:while循環

while(進入條件){執行體}

var count=0;
while(count<10){
  print("count:$count");
  count++;
}
複製代碼

5.4:do...while循環

do{執行體}while(進入條件)

var count=0;
do{
  print("count:$count");
  count++;
}while(count<10);
複製代碼

5.5:break和continue

用於循環體的控制。break直接退出循環;continue進入下次循環

---->[break情景]----
for(var count=0;count<10;count++){
  if(count%3==2){
    break;//直接跳出循環
  }
  print("count:$count");//打印了0,1
}

---->[continue情景]----
for(var count=0;count<10;count++){
  if(count%3==2){
    continue;//跳出本次循環,將進入下次循環
  }
  print("count:$count");//打印了0,1,3,4,6,7,9
}
複製代碼

5.6:switch和case

在很是多的分支時,能夠用switch和case處理,比if...else簡潔

var mark='A';
var evaluation;
switch(mark){
  case'A':
    evaluation="優秀";
    break;
  case'B':
    evaluation="良好";
    break;
  case'C':
    evaluation="普通";
    break;
  case'D':
    evaluation="較差";
    break;
  case'E':
    evaluation="極差";
}
print(evaluation);//優秀
複製代碼

5.7:assert

assert(條件)若是條件不知足,會中斷程序的執行,不然繼續執行流程。

assert(1>2); //程序中斷
複製代碼

本文到此接近尾聲了,另外本人有一個Flutter微信交流羣,歡迎小夥伴加入,共同探討Flutter的問題,本人微信號:zdl1994328,期待與你的交流與切磋。若是想快速嚐鮮Flutter,《Flutter七日》會是你的必備佳品。

Dart 的基礎語法就這樣,下面將進入Dart的面向對象

相關文章
相關標籤/搜索