Dart語言詳解(二)——基本語法

想學Flutter裁替,就請關(guān)注這個專欄
Flutter系列(一)——詳細介紹
Flutter系列(二)——與React Native進行對比
Flutter系列(三)——環(huán)境搭建(Windows)
Flutter系列(四)——HelloWorld
Dart語言詳解(一)——詳細介紹
Dart語言詳解(二)——基本語法

文檔歸檔:
https://github.com/yang0range/flutterfile

前言

之前流济,詳細的介紹了一下Dart語言的前世今生膝晾,接下來,我們就該深入的了解Dart語言泌豆,了解Dart語言的基本數(shù)據(jù)類型插佛,語法等相關(guān)的內(nèi)容

變量和數(shù)據(jù)類型

變量

命名

在Dart語言當中辟癌,定義變量的方式是

dataType viriableName = Initial Valute

這里其實和Java是一樣的背苦,不僅如此連命名的方式也和Java相同,都是采用駝峰命名的方式遗契。

聲明

在聲明的時候辐棒,除了基本數(shù)據(jù)類型之外,還有三種變量的聲明牍蜂。

var漾根,dynamic,Object

var:如果沒有初始值的時候鲫竞,var可以變成任意類型立叛。

dynamic:動態(tài)任意類型,編譯階段不檢查類型贡茅。

Object: 動態(tài)任意類型秘蛇,在編譯階段檢查類型。

和var的區(qū)別:
var如果有初始值顶考,那么類型會被鎖定赁还。

變量的默認值

1.沒有初始值的變量會自動獲取一個默認值null
2.一切皆為對象驹沿,對象的默認值是null艘策。

final和const

表示不可改變
相同點:

  • 聲明的類型可以省略
  • 初始化后不能再賦值
  • 不能和var同時使用

不同點:

  • 類級別常量,使用static const
  • const可使用其他const 常量的值來初始化其值
  • 使用const賦值聲明渊季,const可以省略
  • 可以更改非final朋蔫、非const變量的值。即使曾經(jīng)具有const值
  • const導致的不可變性是可以傳遞的
  • 相同的const常量不會再內(nèi)存中重復創(chuàng)建
  • const需要是編譯時常量

基本數(shù)據(jù)類型

Dart總共又8種基本數(shù)據(jù)類型却汉。
分別是:


image.png
Numbers 數(shù)值型

數(shù)值型里面有包含了int型和doubule兩種類型驯妄,這兩種和Java類似,其中int是整數(shù)型合砂,double是64-bit雙精度浮點數(shù)青扔,這兩種都是Numbers類型的子類。

String

Dart字符串是UTF-16編碼的字符序列。

1.可以使用單引號或者雙引號來創(chuàng)建字符
例如:

void main() {
  print("This is a String");
  print('This is also a stirng');
}

這兩個是一樣的微猖。

2.字符串拼接
例如:

void main() {
  String s1 = "First string.";
  String s2 = "Second string";
  print(s1 + s2);
}

3.字符插值
${exprsssion}谈息,如果表達式是一個標識符,可以省略{}凛剥,如果表達式的結(jié)果為一個對象侠仇,Dart會調(diào)用對象的toString()函數(shù)來獲取一個字符串。
例如:

void main() {
  String s1 = "First string.";
  print("String $s1");
}

void main() {
  print("The sum of 1 and 1 equals ${1 + 1}.");
}

4.多行顯示
使用雙引號創(chuàng)建多行字符
還可以使用(')和(")
例如:

 var s = 'Firtst'
  'Second'
  "Third";
   print(s);

使用三引表示多行字符
例如

 var multilineString = """This is a
   multiline string
   consistiong of
   multiple lines""";
  print(multilineString);

5.使用r前綴創(chuàng)建“原始raw”字符串

  String s4 ="adbchi\ndfafa";
  print(s4);

  String s5 =r"adbchi\ndfafa";
  print(s5);

輸出的結(jié)果

I/flutter (17682): adbchi
I/flutter (17682): dfafa
I/flutter (17682): adbchi\ndfafa
Bool

Dart的bool和Java類似只有兩種類型犁珠,一種是true一種是false逻炊,但是,不同的是bool對象未初始化的默認值是null盲憎。

List
  • 因為在Dart當中嗅骄,由一切皆為對象的概念胳挎,Dart就可以直接打印list包含list的元素饼疙,這點和Java由明顯的不同,java中直接打印list結(jié)果是地址值慕爬。
    例如
 var list = [0, 1, 2, 3, 4, 5, 6];
  print(list);

打印出結(jié)果

I/flutter (24300): [0, 1, 2, 3, 4, 5, 6]
  • Dart中List的下標索引和java一樣都是從0開始窑眯。
  • Dart中List也支持泛型,這點和java一樣医窿,同時還可以進行泛型的判斷磅甩。
 var list1 = List<String>();
 print(list1 is List<String>);
 輸出:
 true

  • 有增刪改查的操作,支持倒敘姥卢,自帶順序卷要,洗牌,可以使用+將兩個List合并独榴。
    例如
  var list = [0, 1, 2, 3, 4, 5, 6];
  print(list);
  var list2 = [7,8,9,10,11];

  print(list+list2);
   輸出:
  [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11]
Set

Dart里面的Set和Java類似僧叉,也是不能存放重復的元素。

  • 兩種初始化方式
    Set有兩種初始化方式
    var setName = <dataType>{}
    Set<dataType> setName ={}
    
  • 大部分操作是和Java類似的
    不同的地方:
  • difference:返回set1集合里面有但是set2里面沒有的元素集合
 Set<String> set1 = {"1","2","3","4","5"};
 Set<String> set2 = {"1","2","3"};
 print(set1.difference(set2));
 輸出:
 {4, 5}
  • intersection:返回set1和set2的交集
Set<String> set1 = {"1","2","3","4","5"};
Set<String> set2 = {"1","2","3"};
print(set1.intersection(set2));
 輸出:
{1, 2, 3}
  • union:返回set1和set2的并集
 Set<String> set1 = {"1","2","3","4","5"};
  Set<String> set2 = {"1","2","3"};
  print(set1.union(set2));
   輸出:
{1, 2, 3, 4, 5}
  • retainAll:set1只保留某些元素(要保留的元素要在原set中存在)
Map

和Java類似

Runes

Runes再Dart當中是字符的UTF-32的編碼

Main(){
  Runes runes = new Runes('\u{1f605} \u6211‘);
  var str1 = String.fromCharCodes(runes);  
  print(str1);
}

Symbol

Symbol標識符棺榔,主要是反射的作用瓶堕,現(xiàn)在再mirrors模塊已經(jīng)被移除了。

函數(shù)

定義

總體來說症歇,和java類似郎笆。
其他幾個特單:

  • 可在函數(shù)內(nèi)定義
  • 定義函數(shù)時可以省略類型
  • 支持縮寫語法=>
int add(int a, int b) => a + b;

可選參數(shù)

  • 可以選擇命名參數(shù)
  • 可以選擇位置參數(shù)
  • 可以添加默認參數(shù)
printer(num n,{String s1, String s2}) { 
  print(n); 
  print(s1); 
  print(s2);
}

main() {
  printer(75, s1: 'hello');
}
printer(num n,{String s1, String s2}) { 
  print(n); 
  print(s1); 
  print(s2);
}

main() {
  printer(75);
}
printer(num n,{String s1, String s2}) { 
  print(n); 
  print(s1); 
  print(s2);
}

main() {
  printer(75, s1: 'hello', s2: 'there');
}
String mysteryMessage(String who, [String what, String where]){
  var message = '$who';
  if(what != null && where == null){
    message = '$message said $what';
  } else if (where != null){
    message = '$message said $what at $where';
  }
  return message;
}

main() {
  var result = mysteryMessage('Billy', 'howdy', 'the ranch');
  print(result);
}

匿名函數(shù)

  • 可以賦值給變量,通過變量調(diào)用
  • 可以在其他函數(shù)當中直接調(diào)用或者傳遞給其他函數(shù)
//匿名函數(shù)
  //賦值給變量
  //無參匿名函數(shù)
  var anonFunc1 = () => print('無參匿名函數(shù)');
  anonFunc1();

  //有參匿名函數(shù)
  var anonFunc = (name) => 'I am $name';
  print(anonFunc('damon'));

  //通過()調(diào)用忘晤,不推薦
//  (()=>print('不推薦'))();

  //匿名函數(shù)傳參
  List test(List list, String func(str)) {
    for (var i = 0; i < list.length; i++) {
      list[i] = func(list[i]);
    }
    return list;
  }

  var list = ['d', 'a', 'm', 'o', 'n'];
  print(test(list, (str) => str * 2)); //String * int, Dart和Python可以這樣用

  //List.forEach()就用的匿名函數(shù)
  List list1 = [11, 12, 13];
  list1.forEach((item) => print('$item'));

  //返回Function對象(閉包)
  Function makeAddFunc(int x) {
    x++;
    return (int y) => x + y;
  }

  var addFunc = makeAddFunc(2);
  print(addFunc(3));

  // 函數(shù)別名
  MyFunc myFunc;
  //可以指向任何同簽名的函數(shù)
  myFunc = subtsract;
  myFunc(4, 2);
  myFunc = divide;
  myFunc(4, 2);
  //typedef 作為參數(shù)傳遞給函數(shù)
  calculator(4, 2, subtsract);
}

//函數(shù)別名
typedef MyFunc(int a, int b);
//根據(jù)MyFunc相同的函數(shù)簽名定義兩個函數(shù)
subtsract(int a, int b) {
  print('subtsract: ${a - b}');
}

divide(int a, int b) {
  print('divide: ${a / b}');
}
//typedef 也可以作為參數(shù)傳遞給函數(shù)
calculator(int a, int b, MyFunc func) {
  func(a, b);
}

邏輯運算

操作符

操作符大部分也和Java相同宛蚓。


image.png

標紅的是不同的,下面著重介紹一下设塔。

?.

條件成員訪問 和 . 類似苍息,但是左邊的操作對象不能為 null,例如 foo?.bar 如果 foo 為 null 則返回 null,否則返回 bar 成員竞思。

 String a;
print(a?.length);
輸出null

 String a="aaa";
print(a?.length);
輸出 3
~/

取商操作符
被除數(shù) ÷ 除數(shù) = 商 ... 余數(shù)表谊,A ~/ B = C,這個C就是商盖喷。相當于Java里的 /

:as爆办、is、is!

類型判定操作
類型判定操作符:as课梳、is距辆、is!在運行時判定對象類型

 //as 類型轉(zhuǎn)換
  num iNum = 1;
  num dNum = 1.0;
  int i = iNum as int;
  double d = dNum as double;
  print([i, d]);

//  String s = iNum as String;

  //is 如果對象是指定的類型返回 True
  print(iNum is int);
  Child child;
  Child child1 = new Child();
  print(child is Parent); //child is Null
  print(child1 is Parent);

  //is! 如果對象是指定的類型返回 False
  print(iNum is! int);
..

級聯(lián)操作符
連續(xù)調(diào)用多個函數(shù)以及訪問成員變量。
兩個點的級聯(lián)語法不是一個操作符暮刃。 只是一個 Dart 特殊語法跨算。

 StringBuffer sb = new StringBuffer();
  sb
    ..write('dongnao')
    ..write('flutter')
    ..write('\n')
    ..writeln('damon');

流程控制語句

  • if else
  • for,forEach椭懊,for-in
  • while诸蚕,do-while
  • break,continue
  • switch case
  • assert
    大部分使用方法都是和Java相同的氧猬。
    不同的有
for-in
  var colorList = ['black','red','yellow'];
  for(var i in colorList){
    print(i);
  }
  輸出:
  I/flutter (31601): black
  I/flutter (31601): red
  I/flutter (31601): yellow
assert

斷言背犯,它可以為代碼執(zhí)行設置條件,用于bool條件為false時中斷正常的運行盅抚。
assert(condition,optional,message)

  var variable;
  print(variable);
  assert(variable!=null);
  variable = 6;
  print(variable);
  輸出:
   [ERROR:flutter/lib/ui/ui_dart_state.cc(157)] Unhandled Exception: 'package:flutter_app/main.dart': Failed assertion: line 50 pos 10: 'variable!=null': is not true.

最后

這一篇文章漠魏,我們詳細的介紹了一下Dart語言的基本語法,了解Java的同學妄均,對這些應該不陌生柱锹。接下來一篇文章,會對Dart語言繼續(xù)進行詳細介紹丰包,讓大家對Dart有一個高階禁熏,全面的認識。

?Flutter已經(jīng)是Top20的軟件庫烫沙,通過接下來的一系列的文章匹层,希望我和大家一起來學習Flutter,一起進步锌蓄,一起有所收獲升筏,掌握未來技術(shù)主流的主動權(quán)!

有什么好的建議瘸爽,意見您访,想法歡迎給我留言!

歡迎關(guān)注公共號

關(guān)注公眾號會有更多收獲剪决!

image.png

動動小手指點贊灵汪,收藏檀训,轉(zhuǎn)發(fā)一鍵三連走一波吧!

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末享言,一起剝皮案震驚了整個濱河市峻凫,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌览露,老刑警劉巖荧琼,帶你破解...
    沈念sama閱讀 211,743評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異差牛,居然都是意外死亡命锄,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,296評論 3 385
  • 文/潘曉璐 我一進店門偏化,熙熙樓的掌柜王于貴愁眉苦臉地迎上來脐恩,“玉大人,你說我怎么就攤上這事侦讨∈幻埃” “怎么了?”我有些...
    開封第一講書人閱讀 157,285評論 0 348
  • 文/不壞的土叔 我叫張陵搭伤,是天一觀的道長只怎。 經(jīng)常有香客問我袜瞬,道長怜俐,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,485評論 1 283
  • 正文 為了忘掉前任邓尤,我火速辦了婚禮拍鲤,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘汞扎。我一直安慰自己季稳,他們只是感情好,可當我...
    茶點故事閱讀 65,581評論 6 386
  • 文/花漫 我一把揭開白布澈魄。 她就那樣靜靜地躺著景鼠,像睡著了一般。 火紅的嫁衣襯著肌膚如雪痹扇。 梳的紋絲不亂的頭發(fā)上铛漓,一...
    開封第一講書人閱讀 49,821評論 1 290
  • 那天,我揣著相機與錄音鲫构,去河邊找鬼浓恶。 笑死,一個胖子當著我的面吹牛结笨,可吹牛的內(nèi)容都是我干的包晰。 我是一名探鬼主播湿镀,決...
    沈念sama閱讀 38,960評論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼伐憾!你這毒婦竟也來了勉痴?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,719評論 0 266
  • 序言:老撾萬榮一對情侶失蹤树肃,失蹤者是張志新(化名)和其女友劉穎蚀腿,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體扫外,經(jīng)...
    沈念sama閱讀 44,186評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡莉钙,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,516評論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了筛谚。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片磁玉。...
    茶點故事閱讀 38,650評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖驾讲,靈堂內(nèi)的尸體忽然破棺而出蚊伞,到底是詐尸還是另有隱情,我是刑警寧澤吮铭,帶...
    沈念sama閱讀 34,329評論 4 330
  • 正文 年R本政府宣布时迫,位于F島的核電站,受9級特大地震影響谓晌,放射性物質(zhì)發(fā)生泄漏掠拳。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,936評論 3 313
  • 文/蒙蒙 一纸肉、第九天 我趴在偏房一處隱蔽的房頂上張望溺欧。 院中可真熱鬧,春花似錦柏肪、人聲如沸姐刁。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,757評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽聂使。三九已至,卻和暖如春谬俄,著一層夾襖步出監(jiān)牢的瞬間柏靶,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,991評論 1 266
  • 我被黑心中介騙來泰國打工凤瘦, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留宿礁,地道東北人。 一個月前我還...
    沈念sama閱讀 46,370評論 2 360
  • 正文 我出身青樓蔬芥,卻偏偏與公主長得像梆靖,于是被迫代替她去往敵國和親控汉。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 43,527評論 2 349