Flutter-從入門到項目 04:Dart語法快速掌握(上)

Flutter 專題目錄匯總: 這個目錄方便大家快速查詢你要學習的內(nèi)容!!!

使用Flutter內(nèi)置美麗的 Material DesignCupertino(iOS風格)widget蜡镶、豐富的motion API裙戏、平滑而自然的滑動效果和平臺感知,為您的用戶帶來全新體驗诗力。

但是這些絲滑的界面也是一行一行的 Dart代碼 構(gòu)建而成,所以了解和掌握 Dart語法 非常重要

我知道可能這一篇文章你不會詳細讀 ===> 換成是我,我也不會,誰會那么枯燥的啃語法,尤其這么一個快節(jié)奏的時代.但是 Dart語法 太重要了??????,希望你這一遍粗略的讀一下,然后點贊收藏??????,等待你針對某一個地方語法不明確的時候.可以根據(jù)標簽?zāi)夸?快速查閱??????(就當字典工具一樣)

更多精品內(nèi)容請關(guān)注公眾號: 邏輯iOS技術(shù)號

那么接下來我們開始從變量和操作符到類和庫給大家一點一點介紹一下! 詳細的內(nèi)容大家可以參考Dart官方文檔:

ps: 這里給大家推薦一下 Open DartPad 就類似 Swift的 Playground

是不是感覺也是非常便利,其實我們簡單的語法測試,完全可以用這個,簡單明了!!!??

① Dart 的重要概念

  • ??每個變量都是一個對象,每個對象是一個類的實例狈谊。甚至數(shù)字疚宇,函數(shù)扒最,和null都是對象告嘲。所有對象都繼承自 Object類

  • ??指定靜態(tài)類型(如 num前面的例子中)講清意圖错维,用 tools 開啟靜態(tài)檢查,但它是可選的橄唬。 (可能注意到當你調(diào)試代碼赋焕,沒有指定類型的變量會得到一個特殊的類型: dynamic

  • ??Dart解析所有的代碼運行之前≡玻可以對Dart提供提示宏邮,例如泽示,通過使用類型或編譯時間常數(shù)來捕獲錯誤或幫助代碼運行更快缸血。

  • ??Dart支持頂級函數(shù)(如 main())也支持類或者對象(靜態(tài)和實例方法分別支持)里的函數(shù)。還可以在函數(shù)里創(chuàng)建函數(shù)(嵌套或局部功能)械筛。

  • ??類似的捎泻,Dart支持頂級變量,以及依賴于類或?qū)ο螅o態(tài)變量和實例變量)變量埋哟。實例變量有時被稱為域或?qū)傩浴?/p>

  • ??與Java不同笆豁,Dart不具備關(guān)鍵字public,protected和private赤赊。如果一個標識符以下劃線(_)開始闯狱,那么它和它的庫都是私有的。有關(guān)詳細信息抛计,請參閱 Libraries and visibility哄孤。

  • ??標識符可以字母或(_)開始,或者是字符加數(shù)字的組合開頭吹截。

  • ??有時瘦陈,判斷是一個表達式還是一個語句會很重要,所以我們要準確了解這兩個單詞波俄。

  • ??Dart tools可報告兩類問題:警告(warning ??)和錯誤(error ?)晨逝。警告只是跡象表明,代碼可能無法正常工作懦铺,但他們不會阻止程序的執(zhí)行捉貌。錯誤可以是編譯時或運行時,編譯時的錯誤阻止代碼執(zhí)行;當代碼執(zhí)行時一個運行時的錯誤會導致一個 異常(exception)被拋出。

  • ??Dart有兩種運行模式:生產(chǎn) (production) 和檢查 (checked) 。我們建議在檢查模式開發(fā)和調(diào)試趁窃,并將其部署到生產(chǎn)模式苍匆。

  • ??Production mode是Dart程序一個速度優(yōu)化的默認運行模式。Production mode忽略 斷言語句(assert statements) 和靜態(tài)類型棚菊。

  • ??Checked mode 是開發(fā)人員友好的方式摆出,可以幫助你在運行時捕捉一些類型的錯誤。例如叹坦,如果分配一個非數(shù)字來聲明為一個 num 變量挖息,然后在檢查模式會拋出異常。

  • ??編程語言并不是孤立存在的码邻,Dart也是這樣折剃,他由語言規(guī)范、虛擬機像屋、類庫和工具等組成:

    • SDK:SDK 包含 Dart VM怕犁、dart2js、Pub己莺、庫和工具奏甫。
    • Dartium:內(nèi)嵌 Dart VMChromium ,可以在瀏覽器中直接執(zhí)行 dart 代碼凌受。
    • Dart2js:將 Dart 代碼編譯為 JavaScript 的工具阵子。
    • Dart Editor:基于Eclipse 的全功能 IDE,并包含以上所有工具胜蛉。支持代碼補全挠进、代碼導航、快速修正誊册、重構(gòu)领突、調(diào)試等功能。

② 關(guān)鍵字

關(guān)鍵字 關(guān)鍵字 關(guān)鍵字 關(guān)鍵字
abstract 2 else import 2 super
as 2 enum in switch
assert export 2 interface 2 sync 1
async 1 extends is this
await 3 extension 2 library 2 throw
break external 2 mixin 2 true
case factory 2 new try
catch false null typedef 2
class final on 1 var
const finally operator 2 void
continue for part 2 while
covariant 2 Function 2 rethrow with
default get 2 return yield 3
deferred 2 hide 1 set 2 static 2
do if show 1 implements 2
dynamic 2
  • 帶有上標1的單詞是上下文關(guān)鍵詞案怯,它們只有在特定的地方才有意義君旦。它們到處都是有效的標識符。

  • 帶有上標2的單詞是內(nèi)置標識符殴泰。為了簡化將JavaScript 代碼移植到 Dart 的任務(wù)于宙,這些關(guān)鍵字在大多數(shù)地方都是有效的標識符,但它們不能用作類或類型名悍汛,也不能用作導入前綴捞魁。

  • 帶有上標3的單詞是與Dart 1.0發(fā)布后添加的異步支持相關(guān)的較新的、有限的保留單詞离咐。不能在任何標記為 async谱俭、async*sync* 的函數(shù)體中使用 awaityield 作為標識符奉件。

  • 表中的所有其他字都是保留字,不能作為標識符昆著。

  • 標識符是給予程序中元素的名稱县貌,如變量,函數(shù)等凑懂。標識符的規(guī)則是
    標識符可以包括字符和數(shù)字煤痕。 但是,標識符不能以數(shù)字開頭接谨。

    • 除下劃線(_)或美元符號($)外摆碉,標識符不能包含特殊符號。
    • 標識符不能是關(guān)鍵字脓豪。
    • 它們必須是獨一無二的
    • 標識符區(qū)分大小寫巷帝。
    • 標識符不能包含空格。
有效標識符 無效標識符
firstName Var
first_name first name
num1 first-name
$result 1number

③ Dart面向?qū)ο笏枷?/h3>

Dart是一種面向?qū)ο蟮恼Z言扫夜。 面向?qū)ο笫且环N遵循真實世界建模的軟件開發(fā)范例楞泼。 Object Orientation 將程序視為通過稱為方法的機制相互通信的對象集合。

A: 對象

對象 – 對象是任何實體的實時表示笤闯。 根據(jù) Grady Brooch堕阔,每個對象必須具有三個功能

  • 狀態(tài) – 由對象的屬性描述。
  • 行為 – 描述對象的行為方式望侈。
  • 標識 – 將對象與一組類似此類對象區(qū)分開的唯一值印蔬。

類 – OOP方面的類是創(chuàng)建對象的藍圖。 類封裝了對象的數(shù)據(jù)脱衙。

方法

方法 – 方法促進對象之間的通信。

// main入口函數(shù)
void main() {
  // 面向?qū)ο?  KCClass cls = new KCClass();
  cls.sayHello();
}

class KCClass{
  void sayHello(){
    print('Hello Dart');
   }
}

④ 變量 & 常量

1: 變量

下面我們開始初始化一個變量 : name 很簡單,跟我們開發(fā)iOS Android 沒有太多的去唄

// 變量聲明初始化
void varibleFunc(){
  var name = 'cooci';
  dynamic nickName = 'KC';
  Object person = '酷C';

  // 顯示聲明將被推斷類型, 可以使用String顯示聲明字符串類型
  String company = 'LG' ;
  print('i am: $name,$nickName,$person ,$company');
}

變量存儲引用例驹。名為 name 的變量包含對值為“ cooci” 的字符串對象的引用捐韩。

name變量的類型被推斷為 String ,聲明沒有靜態(tài)類型的變量被隱式聲明為動態(tài)鹃锈。 也可以使用 dynamic關(guān)鍵字代替 var關(guān)鍵字 聲明變量荤胁,請參考design guidelines指定Object 或者 dynamic

顯示聲明將被推斷類型, 可以使用String顯示聲明字符串類型

2: 默認值

未初始化的變量具有 null 的初始值屎债。即使數(shù)字類型變量最初為 null 仅政,因為數(shù)字是對象。

  // 默認值
  int age;
  assert(age == null);
  print(age); //打印結(jié)果為null盆驹,證明數(shù)字類型初始化值是null

3: Final and const

如果您從未打算更改變量圆丹,可以使用 finalconst 來代替 var 或添加到類型之外。final變量只能設(shè)置一次; const變量 是編譯時常量躯喇。(Const變量 隱式為final辫封。)最終的頂級變量或類變量在第一次使用時進行初始化硝枉。

//  Final and const

 //  Final and const
  final student = 'JZ';
  final String studentName = '家振';
  print('student = ,${[student,studentName]}');

  // 被 final 或 const 修飾的變量無法再去修改其值。
  // student = 'chen'; // a final variable, can only be set once
  const teacher = 'Kody';
  // 這樣寫倦微,編譯器提示:Constant variables can't be assigned a value
  // teacher = 'Cat';

  // flnal 或者 const 不能和 var 同時使用
  // Members can't be declared to be both 'const' and 'var'
  // const var String teacherName = 'CC';
  // final var String teacherName = 'hank';
  
// 常量如果是類級別的妻味,請使用 static const
  static const String lector = 'sky';

其實這里跟我們平時的開發(fā)認知是相同的! 所以大家稍微可以帶過.

⑤ 內(nèi)置類型

Dart 語言對以下類型有特殊的支持:

  • ??numbers
  • ??strings
  • ??booleans
  • ??lists (also known as arrays)
  • ??sets
  • ??maps
  • ??runes (for expressing Unicode characters in a string)
  • ??symbols

可以使用字面量 初始化這些特殊類型中的任何一個對象。例如欣福,'this is a string' 是一個字符串字面量责球,而 true 是一個布爾字面量。

因為 Dart 中的每個變量都指向一個對象(類的實例)拓劝,所以通匙厮校可以使用構(gòu)造函數(shù)來初始化變量。一些內(nèi)置類型有自己的構(gòu)造函數(shù)凿将。例如校套,您可以使用 Map() 構(gòu)造函數(shù)來創(chuàng)建映射。

A: num類型

Dart num有兩種: int + double

// 關(guān)于num 類型測試
void numFunc() {
  int a = 1;
  print(a);

  double b = 1.12;
  print(b);

// String -> int
  int one = int.parse('1');
// 輸出3
  print(one + 2);

// String -> double
  var onePointOne = double.parse('1.1');
// 輸出3.1
  print(onePointOne + 2);

// int -> String
  String oneAsString = 1.toString();
// The argument type 'int' can't be assigned to the parameter type 'String'
//print(oneAsString + 2);
// 輸出 1 + 2
  print('$oneAsString + 2');
// 輸出 1 2
  print('$oneAsString 2');

// double -> String 注意括號中要有小數(shù)點位數(shù)牧抵,否則報錯
  String piAsString = 3.14159.toStringAsFixed(2);
// 截取兩位小數(shù), 輸出3.14
  print(piAsString);

  String aString = 1.12618.toStringAsFixed(2);
// 檢查是否四舍五入笛匙,輸出1.13,發(fā)現(xiàn)會做四舍五入
  print(aString);
}

其中大體都是相似,iOS開發(fā)注意咯 : 類型直接相互轉(zhuǎn)換的代碼!

B: Strings 類型

  • Dart字符串 是由UTF-16編碼單元組成的序列犀变∶盟铮可以使用單引號雙引號創(chuàng)建字符串:

  • 可以使用相鄰的字符串字直接連接在一起 或者 +操作符 來連接字符串:

  • 另一種創(chuàng)建多行字符串的方法是:使用帶有單引號雙引號的三引號:

  • 單引號或者雙引號里面嵌套使用引號。

  • {}來計算字符串中變量的值获枝,需要注意的是如果是表達式需要 ${表達式}

// 關(guān)于string 類型測試
void stringFunc() {
  // `Dart字符串` 是由UTF-16編碼單元組成的序列蠢正。可以使用`單引號`或`雙引號`創(chuàng)建字符串:
  var s1 = '和諧學習,不急不躁';
  var s2 = "等風來不如追風去,總有那么一個人在風景正好的季節(jié)來到你的身邊,并且懂得你全部的好!!!";
  var s3 = '我是Cooci';
  var s4 = 'cooci';

  assert( '$s3' == '我是' + 'Cooci');
  assert( '${s4.toUpperCase()}' == 'COOCI');

  // 可以使用相鄰的字符串字直接連接在一起 或者 `+操作符` 來連接字符串:
  var s5 = 'LG_''Cooci_'"和諧學習不急不躁";
  assert(s5 ==
      'LG_Cooci_和諧學習不急不躁');

  var s6 = 'LG_' + 'Cooci';
  assert(s6 == 'LG_Cooci');

  // 另一種創(chuàng)建多行字符串的方法是:`使用帶有單引號` 或 `雙引號的三引號:`
  var s7 = '''
  單引號創(chuàng)建多行字符串 
  注意要各行哦''';
  var s8 = """雙引號創(chuàng)建多行字符串  
  注意要各行哦""";
  print(s7);
  print(s8);

  // 單引號或者雙引號里面嵌套使用引號省店。
  // 用 {} 來計算字符串中變量的值嚣崭,需要注意的是如果是表達式需要${表達式}

  // 單引號嵌套雙引號
  String s9 = '$s1 a "LG" ${s3}';
  // 輸出 和諧學習,不急不躁 a "LG" 我是Cooci
  print(s9);
  // 雙引號嵌套單引號
  String s10 = "${s4.toUpperCase()} abc 'LG' $s4.toUpperCase()";
  // 輸出 COOCI abc 'aaa' cooci.toUpperCase(),
  // 可以看出 '$s4.toUpperCase()' 沒有加'{}',導致輸出結(jié)果是'cooci.toUpperCase()'
  print(s10);
}

C: Bool 類型

為了表示布爾值懦傍,Dart有一個名為 bool 的類型雹舀。只有兩個對象具有 bool類型 : 布爾字面值 truefalse,它們都是編譯時常量粗俱。因為和我們一般了解一致 我們就不展開篇幅

D: Lists 類型

數(shù)組集合類型是比較廣泛適用的! Dart 里面的 Lists 相對 OC 來說比較簡單. 重點也在 增刪改查,詳情大家查閱??代碼


// Lists 類型測試
void listsFunc(){
  // Dart推斷l(xiāng)ist的類型為list <int>
  // 如果嘗試將非整數(shù)對象添加到此列表中说榆,分析器或運行時將引發(fā)錯誤
  var list = [1, 2, 3];
  // 要創(chuàng)建一個編譯時常量的列表,在列表字面量之前添加const:
  var constantList = const [1, 2, 3];
  // constantList[1] = 1; // 報錯

  // spread operator (...)  的用法
  var list1 = [1, 2, 3];
  var list2 = [0, ...list1];
  print(list2);  // [0, 1, 2, 3]
  // 注意插入空的情況 那么就需要 `(...?)`
  var list3 ;
  var list4 = [0, ...?list3];
  print(list4);  // [0]

  // list 增刪改查
  var list5 = [1, 2, 3];
  list5.add(4); print(list5);       // [1, 2, 3, 4]
  // 刪除元素
  list5.remove(4); print(list5);    // [1, 2, 3]
  list5.removeAt(0); print(list5);  // [2, 3]
  // 修改元素
  list5[1] = 100; print(list5);     // [2, 100]
  // 查詢
  print(list5.indexOf(2));          // 0
  print(list5.elementAt(1));        // 100
  print(list5.contains(666));       // false
}

這里做一個表 方便大家快速查閱學習,代碼你可以敲一下,如果沒有時間也可以不用敲了(比較簡單 ??)

操作 代碼 含義 輸出
初始化 var list5 = [1, 2, 3] 初始化了一個數(shù)組: list5 里面有三個 int 類型的元素: 1, 2, 3 [1, 2, 3]
新增 list5.add(4) 在末尾新增元素: 4 [1, 2, 3, 4]
移除 list5.remove(4) 移除元素: 4 [1, 2, 3]
修改 list5[1] = 100 把下標為 1 的元素修改成 100 [1, 100, 3]
查詢 list5.elementAt(2) 查詢在下標為: 2 的元素 100
判斷 list5.contains(666) 判斷是否存在 666 元素 false

E: Sets 類型

Sets 就是無序集合, 大體的用法也和其他語言相似

// Sets 類型測試
void setsFunc(){
  var names = <String>{};   // 或者 Set<String> names = {};
  // ?? var names = {};     // 創(chuàng)建的是一個 map, 不是 set.
  names.add('teachers');
  print(names);            // {teachers}
  var persons = {'hank', 'cooci', 'kody', 'cc', 'cat'};
  names.addAll(persons);
  print('$names,${names.length}'); // {teachers, hank, cooci, kody, cc, cat}, 6
}

F: Maps 類型

map 是一個關(guān)聯(lián)鍵和值的對象 (也就是我們所說的字典)

  • map 中的鍵值對是唯一的
  • map 里面的 value 可以相同
  • map 里面的 value 可以為空字符串
  • map 里面的 value 可以為 null
// Maps 類型測試
void mapsFunc(){
  var person = {
    // Key:    Value
    'age': 18,
    'name': 'cooci',
    'hobby': '女',
    'height': 1.85
  };
  print(person); // {age: 18, name: cooci, hobby: 女, height: 1.85}
  print('${person.keys},${person.values}'); // (age, name, hobby, height),(18, cooci, 女, 1.85)

  // Map的賦值寸认,中括號中是Key签财,這里可不是數(shù)組
  person['age'] = '20';
  //Map中的鍵值對是唯一的
  //同Set不同,第二次輸入的Key如果存在偏塞,Value會覆蓋之前的數(shù)據(jù)
  person['name'] = 'hank';
  // map里面的value可以相同
  person['hobby'] = 'cooci';
  // map里面value可以為空字符串
  person['hobby'] = '';
  // map里面的value可以為null
  person['height'] = null;
  print(person);    // {age: 20, name: hank, hobby: , height: null}
}

⑥ 參考文獻

Flutter官方文檔: https://flutterchina.club

Dart官方文檔: https://dart.dev/guides/language/language-tour

極客學院團隊: https://wiki.jikexueyuan.com/project/dart-language-tour/important-concepts.html

Dart語法學習: http://www.reibang.com/p/9e5f4c81cc7d

Dart 語法: https://www.pipipi.net/dart/dart-syntax.html

下面給大家推薦一個非常好的iOS干貨輸出點: 邏輯iOS技術(shù)號. 共建iOS繁榮生態(tài), 從你的小愛心??開始

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末唱蒸,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子烛愧,更是在濱河造成了極大的恐慌油宜,老刑警劉巖掂碱,帶你破解...
    沈念sama閱讀 207,113評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異慎冤,居然都是意外死亡疼燥,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,644評論 2 381
  • 文/潘曉璐 我一進店門蚁堤,熙熙樓的掌柜王于貴愁眉苦臉地迎上來醉者,“玉大人,你說我怎么就攤上這事披诗∏思矗” “怎么了?”我有些...
    開封第一講書人閱讀 153,340評論 0 344
  • 文/不壞的土叔 我叫張陵呈队,是天一觀的道長剥槐。 經(jīng)常有香客問我,道長宪摧,這世上最難降的妖魔是什么粒竖? 我笑而不...
    開封第一講書人閱讀 55,449評論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮几于,結(jié)果婚禮上蕊苗,老公的妹妹穿的比我還像新娘。我一直安慰自己沿彭,他們只是感情好朽砰,可當我...
    茶點故事閱讀 64,445評論 5 374
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著喉刘,像睡著了一般瞧柔。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上饱搏,一...
    開封第一講書人閱讀 49,166評論 1 284
  • 那天非剃,我揣著相機與錄音,去河邊找鬼推沸。 笑死,一個胖子當著我的面吹牛券坞,可吹牛的內(nèi)容都是我干的鬓催。 我是一名探鬼主播,決...
    沈念sama閱讀 38,442評論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼恨锚,長吁一口氣:“原來是場噩夢啊……” “哼宇驾!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起猴伶,我...
    開封第一講書人閱讀 37,105評論 0 261
  • 序言:老撾萬榮一對情侶失蹤课舍,失蹤者是張志新(化名)和其女友劉穎塌西,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體筝尾,經(jīng)...
    沈念sama閱讀 43,601評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡捡需,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,066評論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了筹淫。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片站辉。...
    茶點故事閱讀 38,161評論 1 334
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖损姜,靈堂內(nèi)的尸體忽然破棺而出饰剥,到底是詐尸還是另有隱情,我是刑警寧澤摧阅,帶...
    沈念sama閱讀 33,792評論 4 323
  • 正文 年R本政府宣布汰蓉,位于F島的核電站,受9級特大地震影響棒卷,放射性物質(zhì)發(fā)生泄漏顾孽。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,351評論 3 307
  • 文/蒙蒙 一娇跟、第九天 我趴在偏房一處隱蔽的房頂上張望岩齿。 院中可真熱鬧,春花似錦苞俘、人聲如沸盹沈。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,352評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽乞封。三九已至,卻和暖如春岗憋,著一層夾襖步出監(jiān)牢的瞬間肃晚,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,584評論 1 261
  • 我被黑心中介騙來泰國打工仔戈, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留关串,地道東北人。 一個月前我還...
    沈念sama閱讀 45,618評論 2 355
  • 正文 我出身青樓监徘,卻偏偏與公主長得像晋修,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子凰盔,可洞房花燭夜當晚...
    茶點故事閱讀 42,916評論 2 344

推薦閱讀更多精彩內(nèi)容