Flutter 專題目錄匯總: 這個目錄方便大家快速查詢你要學習的內(nèi)容!!!
使用Flutter內(nèi)置美麗的 Material Design
和 Cupertino
(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 VM
的Chromium
,可以在瀏覽器中直接執(zhí)行dart 代碼
凌受。 - Dart2js:將
Dart
代碼編譯為JavaScript
的工具阵子。 - Dart Editor:基于
Eclipse
的全功能 IDE,并包含以上所有工具胜蛉。支持代碼補全挠进、代碼導航、快速修正誊册、重構(gòu)领突、調(diào)試等功能。
- SDK:SDK 包含
② 關(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ù)體中使用await
或yield
作為標識符奉件。表中的所有其他字都是保留字,不能作為標識符昆著。
-
標識符是給予程序中元素的名稱县貌,如變量,函數(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
如果您從未打算更改變量圆丹,可以使用 final
或 const
來代替 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類型
: 布爾字面值 true
和 false
,它們都是編譯時常量粗俱。因為和我們一般了解一致 我們就不展開篇幅
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), 從你的小愛心??開始