該文已授權公眾號 「碼個蛋」题翰,轉載請指明出處
最近 Flutter
真心火爆到不要不要的拙泽,隨大流荆烈,學一波拯勉,在這之前,對于語言的語法還是需要有些必要的了解的憔购,Dart
這門語言宫峦,說實話對于會 Java
這類面向對象的語言的小伙伴們來說,真的灰趁的瘢灰常簡單导绷,這邊我總結了一些 Dart
和 Java
的一些語法差異,當然屎飘,只是部分妥曲,但是贾费,按照我目前的學習進度來說,了解了這些對于寫 Flutter
項目絕對夠了檐盟。小伙伴也可以自己查看褂萧,我這邊提供一個自己學習的網(wǎng)址 Dart 快速入門
溫馨提示:本篇文章沒有圖,沒有圖葵萎,沒有圖导犹,可能會造成部分不適,請注意羡忘,請注意谎痢,請注意,系好安全帶卷雕,我們要「開車了」......
1. Variables
Dart
變量類型可以通過具體的賦值進行推導节猿,例如:var name = 'kuky'
則定義了一個 String
類型對象 name
,也可以通過指定具體的類型 String name = 'kuky'
爽蝴,如果沒有初始化變量沐批,則默認值為 null,類型為數(shù)字的變量默認值同為 null
(同 java
不同蝎亚,java
中 int
默認為 0.)如果需要定義常量,可以通過 final
和 const
進行定義先馆,final
變量只能賦值一次发框,const
是編譯時常量。
2. Build-in-types
Dart
內(nèi)置類型包括 :
Numbers
包括int
[-2^53 ~ 2^53]煤墙,double
[64-bit 浮點數(shù)]-
Strings
Dart
字符串是UTF-16
編碼的字符序列梅惯, 可以使用單引號或者雙引號來創(chuàng)建字符串。- 通過
==
判斷兩個字符串是否相同 - 通過三對單引號
'''aaa'''
或者雙引號"""aaa"""
可以創(chuàng)建多行字符串對象 - 使用前綴
r
創(chuàng)建raw string
仿野,字符串內(nèi)不會進行轉義铣减,例如: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]
? 參數(shù)化定義
var name = <String>['Jone', 'Jack']
-
Maps
鍵值對球涛,例如:var map = {'one': 1, 'two': 2}
? 如果鍵值對需要添加新的鍵值對劣针,直接指定即可,
map['three'] = 3
亿扁,若查找的鍵不存在捺典,返回null
? 參數(shù)化定義
var map = <String, int>{'one': 1, 'two': 2}
Runes
代表字符串的UTF-32 code points
干旁,通常使用\uXXXX
的方式來表示 Unicode code point部念, XXXX 是4個 16 進制的數(shù)腻豌,例如\u2665
返回心形符號 ()Symbols
代表 Dart 程序中聲明的操作符或者標識符厦画,幾乎不使用
3. Function
函數(shù)方法的可選參數(shù)通過在參數(shù)列表中用 {} 指定,例如:
void say(String name, {String word = 'hello'}){
print('$name say $word');
}
// 通過(可選參數(shù)名 + :)進行可選參數(shù)的賦值
main(){
say('kuky', word: 'Hello World'); // kuky say Hello World
}
word 參數(shù)為可選參數(shù)擎浴,默認值為 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(..)
級聯(lián)操作符 (..
) 可以在同一個對象上 連續(xù)調(diào)用多個函數(shù)以及訪問成員變量
class Size{
double x;
double y;
@override
String toString() {
return 'Size{x: $x, y: $y}';
}
}
var size = Size();
/// 通過級聯(lián)操作符進行賦值骏融,可以更加簡潔,!!如果函數(shù)返回值為 void 則不能進行級聯(lián)!!
print(size
..x = 10
..y = 100
..toString()); /// 輸出 Size{x: 10.0, y: 100.0}
7. foreach
通過 foreach
循環(huán)遍歷一個實現(xiàn) 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
如果需要實現(xiàn)繼續(xù)到下一個 case
語句中繼續(xù)執(zhí)行萌狂,則可以 使用 continue
語句跳轉到對應的標簽處繼續(xù)執(zhí)行
var command = 'Close';
switch (command.toLowerCase()) {
case 'close':
print('close');
continue open;
open: // 這是個標簽
case 'open':
print('open');
break;
}
9. Assert
如果條件表達式結果不滿足需要档玻,則可以使用 assert
語句倆打斷代碼的執(zhí)行,例如: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) { // 函數(shù) catch 可以帶有一個或兩個參數(shù),第一個參數(shù)為拋出的異常對象务傲,第二個為堆棧信息
print('Something really unknown: $e');
print('Stack trace:\n $s');
rethrow; // 通過 rethrow 可以將異常重新拋出
}
11. Classes
Dart
中的類都是單繼承凉当,但是同時支持 mixin
的繼承機制(除 Object
類,每個類都只有一個超類)售葡,所有的類都繼承于 Object
看杭,通過調(diào)用 runtimeType
判斷實例的類型。每個實例變量都會自動生成一個 getter
方法(隱含的)挟伙, Non-final 實例變量還會自動生成一個 setter
方法楼雹。
-
Constructors
Dart
的構造函數(shù)同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 通過語法糖省略了構造函數(shù)的賦值過程尖阔,效果同上 }
如果沒有定義構造函數(shù)贮缅,則會有個默認構造函數(shù)。默認構造函數(shù)沒有參數(shù)介却,并且會調(diào)用超類的 沒有參數(shù)的構造函數(shù)谴供。子類不會繼承超類的構造函數(shù),子類如果沒有定義構造函數(shù)齿坷,則只有一個默認構造函數(shù)桂肌。
Dart
通過命名構造函數(shù)為類創(chuàng)建多個構造函數(shù),同時指明意圖class Size { num x, y; Size(this.x, this.y); Size.fromJson(Map json){ this.x = json['x']; this.y = json['y']; } // 因為構造函數(shù)不能繼承胃夏,如果希望子類也有超類一樣的命名構造函數(shù)轴或,必須在子類中實現(xiàn)該構造函數(shù) // 構造函數(shù)體執(zhí)行之前除了可以調(diào)用超類構造函數(shù)之外,還可以初始化實例參數(shù) // 初始化列表非常適合用來設置 final 變量的值 Size.fromJsonInit(Map json) : this.x = json['x'], this.y = json['y']; }
常量構造函數(shù)(如果類需要提供一個狀態(tài)不變的對象仰禀,通過
const
構造函數(shù)實現(xiàn))class ConstPoint { final num x; final num y; const ConstPoint(this.x, this.y); }
工廠方法構造函數(shù)(如果一個類不需要每次都提供一個新的對象照雁,通過
factory
構造函數(shù)實現(xiàn))class HttpCore { HttpCore._internal(); factory HttpCore() { if (_instance == null) _instance = HttpCore._internal(); return _instance; } static HttpCore _instance; static HttpCore get instance => HttpCore(); void _request(){ //... } }
-
每個類都隱式的定義了一個包含所有實例成員的接口, 并且這個類實現(xiàn)了這個接口,通過抽象類實現(xiàn)類似
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); }
有時候要求調(diào)用很多異步方法萍诱,并且等待 所有方法完成后再繼續(xù)執(zhí)行,通過使用
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
的語法污呼,下節(jié)就開始寫 Flutter
啦~裕坊,環(huán)境的安裝具體查看官網(wǎng),很詳細 Flutter 環(huán)境安裝 記得一定要配置鏡像燕酷,配置鏡像籍凝,配置鏡像