什么是 Dart?
? ? Dart 是一種?易于學(xué)習(xí)、?易于擴(kuò)展锅论、并且可以部署到?任何地方(跨平臺) 的?應(yīng)用?編程?語言讼溺。我們用 Dart 來 開發(fā) flutter;
為什么 Dart?
? ?因為 flutter 選擇 Dart 作為 其 開發(fā)的 語言最易,所以 為了開發(fā)?flutter? 就必須學(xué)習(xí) Dart怒坯;
搭建開發(fā)環(huán)境
? ?獲取Dart
? ?Dart SDK下載地址
前置概念
? ??在學(xué)習(xí) Dart 的時候炫狱,請牢記下面一些 事實和 概念:
? ? 1.?所有能夠使用變量引用的都是 對象, 每個對象都是一個類?的實例剔猿。在 Dart 中 甚至連 數(shù)字视译、方法和?null?都是對象。所有的對象都繼承于 Object 類归敬;
? ? 2. 使用靜態(tài)類型可以更清晰的表明你的意圖酷含,并且可以讓靜態(tài)分析工具來分析你的代碼,然后進(jìn)行類型推斷汪茧,聲明變量時候指定類型 并不是牽制性的(在調(diào)試代碼的時候你可能注意到 沒有指定類型的變量的類型為?dynamic)椅亚;
? ? 3. Dart 在運(yùn)行之前會先解析你的代碼。你可以通過使用 類型或者編譯時常量來幫助 Dart 去捕獲異常以及 讓代碼運(yùn)行的更高效舱污;
????4. Dart 支持頂級方法 (例如?main())呀舔,同時還支持在類中定義函數(shù)(靜態(tài)函數(shù)和實例函數(shù)) 你還可以在方法中定義方法 (嵌套方法或者局部方法);
????5. 同樣扩灯,Dart 還支持頂級變量媚赖,以及 在類中定義變量(靜態(tài)變量和實例變量)。 實例變量有時候被稱之為?域(Fields)或者屬性(Properties)珠插;
????6. 和 Java 不同的是省古,Dart 沒有?public、?protected丧失、 和?private?關(guān)鍵字豺妓。如果一個標(biāo)識符以 _開頭,則該標(biāo)識符 在庫內(nèi)是?私有?的布讹;
? ??7.?標(biāo)識符?可以以字母或者 _ 下劃線開頭琳拭,后面可以是 其他字符和數(shù)字的組合;
????8. 有時候?表達(dá)式?expression?和?語句?statement?是有區(qū)別的描验,所以這種情況我們會分別指明每種情況白嘁;
????9. Dart 工具可以指出兩種問題:警告和錯誤。 警告只是說你的代碼可能有問題膘流, 但是并不會阻止你的代碼執(zhí)行絮缅。 錯誤可以是編譯時錯誤也可以是運(yùn)行時錯誤。遇到編譯時錯誤時呼股,代碼將 無法執(zhí)行耕魄;運(yùn)行時錯誤將會在運(yùn)行代碼的時候?qū)е乱粋€異常。
? ? 另外:
? ??????main 方法是固定寫法彭谁,他是程序的入口吸奴。 JS 中沒有預(yù)定的入口函數(shù),但是在 Dart 中, 每個?程序都?必須?有一個頂級的 main() 函數(shù)作為應(yīng)用程序的入口點(diǎn)则奥。
變量
? ? 使用 var 聲明變量考润, 可賦予不同類型的值;
? ??變量未初始化時读处,默認(rèn)值為 null糊治;
? ??如果你以后?不打算修改一個變量,使用?final?或者?const罚舱。?一個 final 變量只能賦值一次井辜;一個 const 變量是編譯時常量(const 變量同時也是 final 變量)。 頂級的 final 變量或者類中的 final 變量在 第一次使用的時候初始化馆匿。
????使用 final 聲明一個只能?賦值一次?的變量;
? ? var name = 'lily';? ?// 創(chuàng)建一個變量并初始化
? ? Object name0 = 'lilei'; //?一個對象的引用不局限于單一的類型燥滑,可以將其指定為?Object(或?dynamic)類型渐北。
? ? String name1 = 'lucy'; // 指定類型? ?
? ??final name = 'Bob';
? ??name = 'Alice'; // Error: a final variable can only be set once.
? ? // dynamic 聲明動態(tài)類型? ?
? ?dynamic a = 20;? ?
? ?a = ' sssss'
常量
? ? 使用 const 聲明常量;
? ? 使用 const 聲明的必須是?編譯期常量铭拧, 常量不能修改赃蛛, 跟 js 一樣;
數(shù)據(jù)類型
? ? Dart 的內(nèi)置數(shù)據(jù)類型
? ??????Numbers?(int,?double)
????????Strings?(String)
????????Booleans?(bool)
????????Lists?(也被稱為?arrays)
????????Sets?(Set)
????????Maps?(Map)
????????Runes?(常用于在?Characters?API 中進(jìn)行字符替換)
????????Symbols?(Symbol)
????????The value?null?(Null)
數(shù)值類型
? ??關(guān)鍵字 num 分為:整型 int? ?搀菩、浮點(diǎn)型 double
? ? 有具體類型呕臂,就可以不用 var 聲明,使用具體的類型
數(shù)值型操作
? ??運(yùn)算符 : +肪跋、-歧蒋、*、/州既、~/ (這兩個貨在一起叫取整)谜洽、%( 取余)
? ? 常用屬性: isNAN,isEven, isOdd等(返回布爾值)
? ? 常用方法:abs()吴叶、round()阐虚、floor(), ceil()、toInt()蚌卤、toDouble()? 看文檔
字符串
? ? 關(guān)鍵字 String
? ? ????使用?單引號?或者 雙引號?創(chuàng)建字符串
? ? ????使用三個 引號 或者 雙引號 創(chuàng)建多行字符串(跟python不一樣实束、python是注釋)
? ? 使用 r 創(chuàng)建原始 raw字符串
? ? ?????加上 r? 打印的時候就會把 \n 打印出來, 不會進(jìn)行它具體含義的表達(dá)(即不會被做任何處理(比如轉(zhuǎn)義)的字符串)逊彭;
? ? 字符串操作
? ? ????運(yùn)算符 : +? 咸灿、 * 、==侮叮、 [ ]
? ? ????str [下標(biāo) ]
? ??????在字符串中析显,請以?${?表達(dá)式?}? 的形式使用表達(dá)式,如果表達(dá)式是一個標(biāo)識符,可以省略掉 {}
? ? ????插值表達(dá)式: ${ expression }
? ? 常用屬性: length 谷异, isEmpty
? ? 常用方法: contains(), subString(), startsWith(), endsWith(), indexOf(), lastIndexOf()
? ? toLowerCase(), toUpperCase(), trim(), trimLeft(), trimRight(), split(), replace() 太多了分尸,自己查 api
?布爾型
? ??當(dāng) Dart 需要一個布爾值的時候,只有?true?對象才被認(rèn)為是 true歹嘹,?所有其他的值都是 flase箩绍。這點(diǎn)和 JavaScript 不一樣, 像?1尺上、?"aString"材蛛、 以及?someObject?等值都被認(rèn)為是 false。
? ? 關(guān)鍵字 bool
? ? bool a = true;? ?bool b = false怎抛;
????Dart 的類型安全?不允許?你使用類似?if (nonbooleanValue)?或者?assert (nonbooleanValue)?這樣的代碼檢查布爾值卑吭。相反,你應(yīng)該總是?顯示地檢查布爾值马绝,比如像下面的代碼這樣:
列表List (數(shù)組)
? ???創(chuàng)建方式:
? ? ? ? 1 var list = [1,2,3]豆赏;
????????2 創(chuàng)建?不可變 list?:var list = const [1,2,3];
? ? ? ? 3 構(gòu)造創(chuàng)建: var list = new List()富稻;
????????Dart 在 2.3 引入了?擴(kuò)展操作符(...)和?空感知擴(kuò)展操作符(...?)
? ??????如果擴(kuò)展操作符?右邊?可能為 null 掷邦,你可以使用 null-aware 擴(kuò)展操作符(...?)來避免產(chǎn)生異常:
? ??????Dart 還同時引入了?集合中的 if?和?集合中的 for?操作,在構(gòu)建集合時椭赋,可以使用條件判斷 (if) 和循環(huán) (for)抚岗;
????????常用操作
? ? ? ? ? length ,? add(), insert(下標(biāo),要插入的內(nèi)容), remove(要移出的內(nèi)容), clear(), 返回下標(biāo)indexOf(要查找的內(nèi)容), lastIndexOf(), sort(),sublist(), shuffle(),asMap(), forEach()
? ? ? ? list.asMap() 將 list 轉(zhuǎn)換為 map哪怔,key 就是下標(biāo)
Map
? ??Map 是用來關(guān)聯(lián) keys 和 values 的對象宣蔚。其中鍵和值都可以是任何類型的對象,每個?鍵?只能出現(xiàn)一次但是?值?可以重復(fù)出現(xiàn)多次(基本和 JS 的操作相同)认境;
? ??創(chuàng)建方式:
? ? 1. var map = { key: value, key: value }
????2. 創(chuàng)建?不可變Map
? ???????var map = const? { key: value, key: value }
????3. 構(gòu)造創(chuàng)建: var map?= new?Map()
? ??檢索的 Key 不存在于 Map 中則會返回一個 null件已;
? ? 常用操作
? ? ? ? length, isEmpty(), isNotEmpty(), keys, values, containsKey(), containsValue(),remove(),
forEach()
? ? print(map.keys) 打印所有的 key
? ??Map 可以像 List 一樣支持使用擴(kuò)展操作符(...?和?...?)以及集合的 if 和 for 操作。
Set
? ??在 Dart 中元暴,set 是一組特定元素的無序集合篷扩。 Dart 支持的集合由集合的字面量( Set?字面量literals?是在 Dart 2.2 中才加入的 ) 和 Set?類?提供;
? ??Set 還是 map?? Map 字面量語法相似于 Set 字面量語法茉盏。因為先有的 Map 字面量語法鉴未,所以?{}?默認(rèn)是?Map?類型。如果忘記在?{}?上注釋類型或賦值到一個未聲明類型的變量上鸠姨,那么 Dart 會創(chuàng)建一個類型為?Map<dynamic, dynamic>?的對象铜秆。
? ??從 Dart 2.3 開始,Set 可以像 List 一樣支持使用擴(kuò)展操作符(...?和?...?)以及 Collection?if?和?for?操作讶迁。
? ? 添加元素 add 连茧、addAll
? ? 獲取元素的數(shù)量??.length?
????Set 變量前添加 const 關(guān)鍵字創(chuàng)建一個 Set 編譯時常量:
函數(shù)
? ??函數(shù)?也是對象,并且有具體類型 Function
? ??方法定義
? ? ? ? 返回類型 方法名( 參數(shù)1,參數(shù)2啸驯,.......) {
? ? ? ? ? ? ? ? // 函數(shù)體.....?
? ? ? ? ? ? ? ? return 返回值客扎;
? ? ? ?}
? ???? 返回值類型、參數(shù)類型都可省略罚斗;
? ??????方法都有返回值徙鱼,如果沒有指定,默認(rèn) return null
? ? 箭頭函數(shù)
? ??????語法?=>?表達(dá)式?是?{ return?表達(dá)式针姿;}?的簡寫
? ? 可選參數(shù)
? ??????函數(shù)可以有兩種形式的參數(shù):必要參數(shù)?和?可選參數(shù)袱吆;
? ??????必要參數(shù)?定義在?參數(shù)列表前面,可選參數(shù)?則定義在?必要參數(shù)后面距淫;
? ? ? ? 可選參數(shù)的兩種形式?命名的?或?位置的绞绒;
? ??????????命名參數(shù)
? ??????????????使用 { }?將一系列參數(shù)包裹起來作為 命名參數(shù):
? ??????????????命名參數(shù)默認(rèn)為可選參數(shù),當(dāng)你調(diào)用函數(shù)時榕暇,可以使用?參數(shù)名:?參數(shù)值?的形式來指定命名參數(shù)蓬衡;
? ?????????位置參數(shù)
? ??????????????使用?[ ]?將一系列參數(shù)包裹起來作為位置參數(shù),?
????????????????當(dāng)你調(diào)用函數(shù)時拐揭,就不用key, value 形式了撤蟆,但是?一定要按順序?來奕塑,不能像上述?命名參數(shù) 那樣 位置隨便堂污;
? ? 默認(rèn)參數(shù)
? ??????使用 = 在可選參數(shù)指定默認(rèn)值, 默認(rèn)值只能是編譯期常量龄砰,沒有指定默認(rèn)值的情況下默認(rèn)值為?null盟猖,跟JS一樣;
? ? 匿名函數(shù)
? ??????可以創(chuàng)建一個沒有名字的方法换棚,稱之為?匿名函數(shù)式镐、?Lambda 表達(dá)式?或?Closure 閉包;
? ??????????([ [類型]?參數(shù)[, …] ]) {
? ? ? ? ? ? ? //函數(shù)體;
????????????};
? ?詞法作用域
? ??????Dart 是詞法有作用域語言固蚤,變量的作用域在寫代碼的時候就確定了娘汞,大括號內(nèi)定義的變量只能在大括號內(nèi)訪問,與 Java 類似夕玩;
? ? ? ? 函數(shù)內(nèi)部能訪問到包括頂層變量在內(nèi)的所有的變量你弦, 同 JS 一樣;
? ?閉包
? ??????閉包?即一個函數(shù)對象燎孟,即使函數(shù)對象的調(diào)用在它原始作用域之外禽作,依然能夠訪問在它詞法作用域內(nèi)的變量。
? ??????函數(shù)可以封閉定義到它作用域內(nèi)的變量揩页。
返回值
????所有的函數(shù)都有返回值旷偿。沒有顯示返回語句的函數(shù)最后一行默認(rèn)為執(zhí)行?return null;。
main() 函數(shù)
? ??每個 Dart 程序都?必須?有一個?main()?頂級函數(shù)作為程序的入口,?main()?函數(shù)返回值為?void?并且有一個?List<String>?類型的可選參數(shù)萍程。