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

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

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

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

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

更多精品內容請關注公眾號: 邏輯iOS技術號

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

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

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

① Dart 的重要概念

  • ??每個變量都是一個對象,每個對象是一個類的實例。甚至數字,函數,和null都是對象。所有對象都繼承自 Object類

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

  • ??Dart解析所有的代碼運行之前。可以對Dart提供提示,例如,通過使用類型或編譯時間常數來捕獲錯誤或幫助代碼運行更快。

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

  • ??類似的,Dart支持頂級變量,以及依賴于類或對象(靜態變量和實例變量)變量。實例變量有時被稱為域或屬性。

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

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

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

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

  • ??Dart有兩種運行模式:生產 (production) 和檢查 (checked) 。我們建議在檢查模式開發和調試,并將其部署到生產模式。

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

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

  • ??編程語言并不是孤立存在的,Dart也是這樣,他由語言規范、虛擬機、類庫和工具等組成:

    • SDK:SDK 包含 Dart VM、dart2js、Pub、庫和工具。
    • Dartium:內嵌 Dart VMChromium ,可以在瀏覽器中直接執行 dart 代碼
    • Dart2js:將 Dart 代碼編譯為 JavaScript 的工具。
    • Dart Editor:基于Eclipse 的全功能 IDE,并包含以上所有工具。支持代碼補全、代碼導航、快速修正、重構、調試等功能。

② 關鍵字

關鍵字 關鍵字 關鍵字 關鍵字
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的單詞是上下文關鍵詞,它們只有在特定的地方才有意義。它們到處都是有效的標識符。

  • 帶有上標2的單詞是內置標識符。為了簡化將JavaScript 代碼移植到 Dart 的任務,這些關鍵字在大多數地方都是有效的標識符,但它們不能用作類或類型名,也不能用作導入前綴。

  • 帶有上標3的單詞是與Dart 1.0發布后添加的異步支持相關的較新的、有限的保留單詞。不能在任何標記為 asyncasync*sync* 的函數體中使用 awaityield 作為標識符。

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

  • 標識符是給予程序中元素的名稱,如變量,函數等。標識符的規則是
    標識符可以包括字符和數字。 但是,標識符不能以數字開頭。

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

③ Dart面向對象思想

Dart是一種面向對象的語言。 面向對象是一種遵循真實世界建模的軟件開發范例。 Object Orientation 將程序視為通過稱為方法的機制相互通信的對象集合。

A: 對象

對象 – 對象是任何實體的實時表示。 根據 Grady Brooch,每個對象必須具有三個功能

  • 狀態 – 由對象的屬性描述。
  • 行為 – 描述對象的行為方式。
  • 標識 – 將對象與一組類似此類對象區分開的唯一值。

類 – OOP方面的類是創建對象的藍圖。 類封裝了對象的數據。

方法

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

// main入口函數
void main() {
  // 面向對象
  KCClass cls = new KCClass();
  cls.sayHello();
}

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

④ 變量 & 常量

1: 變量

下面我們開始初始化一個變量 : name 很簡單,跟我們開發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 ,聲明沒有靜態類型的變量被隱式聲明為動態。 也可以使用 dynamic關鍵字代替 var關鍵字 聲明變量,請參考design guidelines指定Object 或者 dynamic

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

2: 默認值

未初始化的變量具有 null 的初始值。即使數字類型變量最初為 null ,因為數字是對象。

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

3: Final and const

如果您從未打算更改變量,可以使用 finalconst 來代替 var 或添加到類型之外。final變量只能設置一次; 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';

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

⑤ 內置類型

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 中的每個變量都指向一個對象(類的實例),所以通常可以使用構造函數來初始化變量。一些內置類型有自己的構造函數。例如,您可以使用 Map() 構造函數來創建映射。

A: num類型

Dart num有兩種: int + double

// 關于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 注意括號中要有小數點位數,否則報錯
  String piAsString = 3.14159.toStringAsFixed(2);
// 截取兩位小數, 輸出3.14
  print(piAsString);

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

其中大體都是相似,iOS開發注意咯 : 類型直接相互轉換的代碼!

B: Strings 類型

  • Dart字符串 是由UTF-16編碼單元組成的序列。可以使用單引號雙引號創建字符串:

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

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

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

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

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

  // 另一種創建多行字符串的方法是:`使用帶有單引號` 或 `雙引號的三引號:`
  var s7 = '''
  單引號創建多行字符串 
  注意要各行哦''';
  var s8 = """雙引號創建多行字符串  
  注意要各行哦""";
  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()' 沒有加'{}',導致輸出結果是'cooci.toUpperCase()'
  print(s10);
}

C: Bool 類型

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

D: Lists 類型

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


// Lists 類型測試
void listsFunc(){
  // Dart推斷list的類型為list <int>
  // 如果嘗試將非整數對象添加到此列表中,分析器或運行時將引發錯誤
  var list = [1, 2, 3];
  // 要創建一個編譯時常量的列表,在列表字面量之前添加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] 初始化了一個數組: 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 = {};     // 創建的是一個 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 是一個關聯鍵和值的對象 (也就是我們所說的字典)

  • 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,這里可不是數組
  person['age'] = '20';
  //Map中的鍵值對是唯一的
  //同Set不同,第二次輸入的Key如果存在,Value會覆蓋之前的數據
  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.lxweimin.com/p/9e5f4c81cc7d

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

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

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 228,333評論 6 531
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 98,491評論 3 416
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 176,263評論 0 374
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 62,946評論 1 309
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,708評論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,186評論 1 324
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,255評論 3 441
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,409評論 0 288
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 48,939評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,774評論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 42,976評論 1 369
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,518評論 5 359
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,209評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,641評論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,872評論 1 286
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,650評論 3 391
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 47,958評論 2 373

推薦閱讀更多精彩內容