Flutter 專題目錄匯總: 這個目錄方便大家快速查詢你要學習的內容!!!
使用Flutter內置美麗的 Material Design
和 Cupertino
(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 VM
的Chromium
,可以在瀏覽器中直接執行dart 代碼
。 - Dart2js:將
Dart
代碼編譯為JavaScript
的工具。 - Dart Editor:基于
Eclipse
的全功能 IDE,并包含以上所有工具。支持代碼補全、代碼導航、快速修正、重構、調試等功能。
- SDK:SDK 包含
② 關鍵字
關鍵字 | 關鍵字 | 關鍵字 | 關鍵字 |
---|---|---|---|
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發布后添加的異步支持相關的較新的、有限的保留單詞。不能在任何標記為
async
、async*
或sync*
的函數體中使用await
或yield
作為標識符。表中的所有其他字都是保留字,不能作為標識符。
-
標識符是給予程序中元素的名稱,如變量,函數等。標識符的規則是
標識符可以包括字符和數字。 但是,標識符不能以數字開頭。- 除下劃線(_)或美元符號($)外,標識符不能包含特殊符號。
- 標識符不能是關鍵字。
- 它們必須是獨一無二的
- 標識符區分大小寫。
- 標識符不能包含空格。
有效標識符 | 無效標識符 |
---|---|
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
如果您從未打算更改變量,可以使用 final
或 const
來代替 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類型
: 布爾字面值 true
和 false
,它們都是編譯時常量。因為和我們一般了解一致 我們就不展開篇幅
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繁榮生態, 從你的小愛心??開始