Flutter 入門指北(Part 1)之 Dart
該文已授權公眾號 「碼個蛋」,轉載請指明出處
最近Flutter
真心火爆到不要不要的,隨大流,學一波,在這之前,對於語言的語法還是需要有些必要的瞭解的,Dart
這門語言,說實話對於會Java
這類面向物件的語言的小夥伴們來說,真的灰常灰常簡單,這邊我總結了一些Dart
和Java
的一些語法差異,當然,只是部分,但是,按照我目前的學習進度來說,瞭解了這些對於寫Flutter
專案絕對夠了。小夥伴也可以自己檢視,我這邊提供一個自己學習的網址Dart 快速入門
溫馨提示:本篇文章沒有圖,沒有圖,沒有圖 ,可能會造成部分不適,請注意,請注意,請注意 ,繫好安全帶,我們要「開車了」......
1. Variables
Dart
變數型別可以通過具體的賦值進行推導,例如:var name = 'kuky'
則定義了一個String
型別物件name
,也可以通過指定具體的型別String name = 'kuky'
,如果沒有初始化變數,則預設值為 null,型別為數字的變數預設值同為null
(
同java
不同,java
中int
預設為 0.
)如果需要定義常量,可以通過final
和const
進行定義,final
變數只能賦值一次,const
是編譯時常量。
2. Build-in-types
Dart
內建型別包括 :
-
Numbers
包括int
[-2^53 ~ 2^53],double
[64-bit 浮點數] -
Strings
Dart
字串是UTF-16
編碼的字元序列, 可以使用單引號或者雙引號來建立字串。-
通過
==
判斷兩個字串是否相同 -
通過三對單引號
'''aaa'''
或者雙引號"""aaa"""
可以建立多行字串物件 -
使用字首
r
建立raw string
,字串內不會進行轉義,例如:var a = r'haha \n breakLine'
列印a
物件則會按照輸入的輸出,不會進行換行
-
通過
-
Booleans
Dart
中,只有true
物件才被認為是true
, 所有其他的值都是false
-
Lists
列表,例如:var list = [1, 2, 3, 4]
通過
const
關鍵詞可以定義一個不可變列表var list = const [1, 2, 3, 4]
引數化定義
var name = <String>['Jone', 'Jack']
-
Maps
鍵值對,例如:var map = {'one': 1, 'two': 2}
如果鍵值對需要新增新的鍵值對,直接指定即可,
map['three'] = 3
,若查詢的鍵不存在,返回null
引數化定義
var map = <String, int>{'one': 1, 'two': 2}
-
Runes
代表字串的UTF-32 code points
,通常使用\uXXXX
的方式來表示 Unicode code point, XXXX 是4個 16 進位制的數,例如\u2665
返回心形符號 () -
Symbols
代表 Dart 程式中宣告的操作符或者識別符號,幾乎不使用
3. Function
函式方法的可選引數通過在引數列表中用 {} 指定,例如:
void say(String name, {String word = 'hello'}){ print('$name say $word'); } // 通過(可選引數名 + :)進行可選引數的賦值 main(){ say('kuky', word: 'Hello World'); // kuky say Hello World } 複製程式碼
word 引數為可選引數,預設值為 hello
4. Operators
操作符幾乎和別的語言類似,提個比較特殊的賦值操作符??=
和?.
操作符
var a = 1; var b; b ?? = a; // 如果 b 的值是 null 則將 a 賦值給 b,否則保持不變 var c = size?.x; // 如果 size 為 null 則返回 null,否則返回 size.a 的值 複製程式碼
5. Conditional Expressions
Dart
可以通過兩個特殊的操作符替換if(){} else{}
表示式
/// condition? expr1: expr2 同 java 三目運算子 var a = -1; a = a < 0 ? -1 : a; /// expr1 ?? expr2 String toString() => msg ?? super.toString() // 如果 expr1 不為 null 則返回 expr1 否則返回 expr2 複製程式碼
6. Cascade Notaion(..)
級聯操作符 (..
) 可以在同一個物件上 連續呼叫多個函式以及訪問成員變數
class Size{ double x; double y; @override String toString() { return 'Size{x: $x, y: $y}'; } } var size = Size(); /// 通過級聯操作符進行賦值,可以更加簡潔,!!如果函式返回值為 void 則不能進行級聯!! print(size ..x = 10 ..y = 100 ..toString()); /// 輸出 Size{x: 10.0, y: 100.0} 複製程式碼
7. foreach
通過foreach
迴圈遍歷一個實現Iterable
介面的物件
var items = [1, 2, 3, 4, 5]; var maps = {'a': 1, 'b': 2}; items.where((i) => i > 2).forEach((i) => print(i));// 3, 4, 5 maps.forEach((key, value) => print('$key => $value')); // a => 1, b => 2 複製程式碼
8. Switch and case
如果需要實現繼續到下一個case
語句中繼續執行,則可以 使用continue
語句跳轉到對應的標籤處繼續執行
var command = 'Close'; switch (command.toLowerCase()) { case 'close': print('close'); continue open; open: // 這是個標籤 case 'open': print('open'); break; } 複製程式碼
9. Assert
如果條件表示式結果不滿足需要,則可以使用assert
語句倆打斷程式碼的執行,例如:assert(a == 1);
10. Exceptions
所有的Dart
異常是非檢查異常。捕捉exceptions
的時候可以通過on
指定exceptions
型別,再使用catch
捕獲
try { breedMoreLlamas(); } on OutOfLlamasException { buyMoreLlamas(); } on Exception catch (e) { print('Unknown exception: $e'); } catch (e, s) { // 函式 catch 可以帶有一個或兩個引數,第一個引數為丟擲的異常物件,第二個為堆疊資訊 print('Something really unknown: $e'); print('Stack trace:\n $s'); rethrow; // 通過 rethrow 可以將異常重新丟擲 } 複製程式碼
11. Classes
Dart
中的類都是單繼承,但是同時支援
mixin
的繼承機制(
除Object
類,每個類都只有一個超類
),所有的類都繼承於Object
,通過呼叫runtimeType
判斷例項的型別。每個例項變數都會自動生成一個
getter
方法(隱含的), Non-final 例項變數還會自動生成一個
setter
方法。
-
Constructors
Dart
的建構函式同Java
類似class Size { num x, y; Size(num nx, num y){ x = nx; this.y = y; // this 關鍵字只有當名字衝突時候使用,否則 Dart 推薦省略 this } Size(this.x, this.y); // Dart 通過語法糖省略了建構函式的賦值過程,效果同上 } 複製程式碼
如果沒有定義建構函式,則會有個預設建構函式。預設建構函式沒有引數,並且會呼叫超類的 沒有引數的建構函式。子類不會繼承超類的建構函式,子類如果沒有定義建構函式,則只有一個預設建構函式。
Dart
通過命名建構函式為類建立多個建構函式,同時指明意圖class Size { num x, y; Size(this.x, this.y); Size.fromJson(Map json){ this.x = json['x']; this.y = json['y']; } // 因為建構函式不能繼承,如果希望子類也有超類一樣的命名建構函式,必須在子類中實現該建構函式 // 建構函式體執行之前除了可以呼叫超類建構函式之外,還可以初始化例項引數 // 初始化列表非常適合用來設定 final 變數的值 Size.fromJsonInit(Map json) : this.x = json['x'], this.y = json['y']; } 複製程式碼
常量建構函式(如果類需要提供一個狀態不變的物件,通過
const
建構函式實現)class ConstPoint { final num x; final num y; const ConstPoint(this.x, this.y); } 複製程式碼
工廠方法建構函式(如果一個類不需要每次都提供一個新的物件,通過
factory
建構函式實現)class HttpCore { HttpCore._internal(); factory HttpCore() { if (_instance == null) _instance = HttpCore._internal(); return _instance; } static HttpCore _instance; static HttpCore get instance => HttpCore(); void _request(){ //... } } 複製程式碼
-
每個類都隱式的定義了一個包含所有例項成員的介面, 並且這個類實現了這個介面,通過抽象類實現類似
Java
介面的功能。abstract class Callback { void print(String msg); } class A implements Callback{ @override void print(String msg) { print(msg); } } 複製程式碼
-
MixinsDart | 什麼是Mixin
12. Asynchrony support
-
Future
loopIntegers() { // 通過 then 進行獲取到 Future 物件後的操作 getListDelay().then((ints) => ints.forEach((i) => print(i))); } // 生成一個 Future 物件 Future<List<int>> getListDelay() { return Future.delayed(Duration(seconds: 2), () => List.generate(10, (delta) => delta)); } 複製程式碼
通過
async
await
簡化Future
操作runUsingFuture() { //... findEntrypoint().then((entrypoint) { return runExecutable(entrypoint, args); }).then(flushThenExit); } // 簡化了 then runUsingAsyncAwait() async { //... var entrypoint = await findEntrypoint(); var exitCode = await runExecutable(entrypoint, args); await flushThenExit(exitCode); } 複製程式碼
有時候要求呼叫很多非同步方法,並且等待 所有方法完成後再繼續執行,通過使用
Future.wait()
進行管理Future deleteDone = deleteLotsOfFiles(); Future copyDone = copyLotsOfFiles(); Future checksumDone = checksumLotsOfOtherFiles(); Future.wait([deleteDone, copyDone, checksumDone]) .then((List values) { print('Done with all the long steps'); }); 複製程式碼
-
StreamDart|什麼是 Stream
大概瞭解了Dart
的語法,下節就開始寫Flutter
啦~,環境的安裝具體檢視官網,很詳細Flutter 環境安裝 記得一定要配置映象,配置映象,配置映象