該文已授權公眾號 「碼個蛋」,轉載請指明出處
最近 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); } } 複製程式碼
-
Mixins Dart | 什麼是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'); }); 複製程式碼
-
Stream Dart|什麼是 Stream
大概瞭解了 Dart
的語法,下節就開始寫 Flutter
啦~,環境的安裝具體檢視官網,很詳細 Flutter 環境安裝 記得一定要配置映象,配置映象,配置映象