Dart 官方文檔學習筆記,記錄 Dart 特色和區別於其它語言之處html
#基本特色web
#變量與類型express
#函數json
void enableFlags({bool bold, bool hidden}) {...}
複製代碼
enableFlags(bold: true, hidden: false);
複製代碼
const Scrollbar({Key key, @required Widget child})
複製代碼
String say(String from, String msg, [String device]) {
var result = '$from says $msg';
if (device != null) {
result = '$result with a $device';
}
return result;
}
複製代碼
void main() {
}
或
void main(List<String> arguments) {
}
複製代碼
函數定義式(包括前面帶上名字的箭頭函數)至關於定義了一個閉包類型的變量,等價於定義並將一個匿名函數賦值給一個變量,但不能夠同時定義命名函數又賦值給變量bash
做用域遵循詞法做用域,做用域是靜態肯定的,函數可以使用其定義時的變量多線程
任何函數都有返回值,如爲顯示指明則返回null,故函數調用式必定是表達式閉包
多元運算符的版本由最左邊一個參數決定異步
~/:整除(向下取整)async
==規則:若是涉及到null,必須兩邊都爲null則返回true,不然返回false;若是不涉及null,返回左邊參數的x.==(y)方法結果ide
is;is!:判斷一個對象是(不是)一個類的實現(包括子類)
as:將一個對象強轉爲一個類,若是該對象爲null或不是該類將報錯
??=:若是爲null就賦值,不然不動
^:按位異或
~:按位取反
??:條件運算符,若是左邊不爲null返回左邊,不然返回右邊
..:級聯運算符,表示把左邊對象中的右邊成員取出進行某項操做再返回該對象
?.:條件獲取成員,若是左邊爲null也不報錯而是返回null
#結構語句
else if中間分開一個空格
能夠用forEach()和for-in遍歷可迭代對象,好比Map,List
switch分支比對的目標必須是編譯時常量,被比較實例必須是同一類(不能夠是子類),不可重寫==
異常分爲Exception和Error兩類以及它們的子類
方法無需進行異常聲明和檢查
能夠throw任意對象,固然不建議這樣作
throw式是一個表達式
on指明捕捉的異常類型,catch指明異常參數,二者可配合使用,有了on可省略catch
catch有第二個參數StackTrace
在catch塊中,可用rethrow關鍵字繼續拋出該異常
就算遇到未捕獲的異常,也會先執行完finally中的異常再拋出
#面向對象
Point.origin() {
x = 0;
y = 0;
}
複製代碼
class Employee extends Person {
// Person does not have a default constructor;
// you must call super.fromJson(data).
Employee.fromJson(Map data) : super.fromJson(data) {
print('in Employee');
}
}
複製代碼
// Initializer list sets instance variables before
// the constructor body runs.
Point.fromJson(Map<String, num> json)
: x = json['x'],
y = json['y'] {
print('In Point.fromJson(): ($x, $y)');
}
複製代碼
class Point {
num x, y;
// The main constructor for this class.
Point(this.x, this.y);
// Delegates to the main constructor.
Point.alongXAxis(num x) : this(x, 0);
}
複製代碼
class ImmutablePoint {
static final ImmutablePoint origin =
const ImmutablePoint(0, 0);
final num x, y;
const ImmutablePoint(this.x, this.y);
}
複製代碼
class Logger {
final String name;
bool mute = false;
// _cache is library-private, thanks to
// the _ in front of its name.
static final Map<String, Logger> _cache =
<String, Logger>{};
factory Logger(String name) {
if (_cache.containsKey(name)) {
return _cache[name];
} else {
final logger = Logger._internal(name);
_cache[name] = logger;
return logger;
}
}
Logger._internal(this.name);
void log(String msg) {
if (!mute) print(msg);
}
}
複製代碼
enum Color { red, green, blue }
複製代碼
abstract class Cache<T> {
T getByKey(String key);
void setByKey(String key, T value);
}
複製代碼
var names = <String>['Seth', 'Kathy', 'Lars'];
var pages = <String, String>{
'index.html': 'Homepage',
'robots.txt': 'Hints for web robots',
'humans.txt': 'We are people, not machines'
};
複製代碼
print(names is List<String>);
複製代碼
#異步處理
await for (varOrType identifier in expression) {
// Executes each time the stream emits a value.
}
複製代碼
#其它
當給類實現了call()方法,類的實例就能夠像函數同樣被調用了
經過isolate處理多線程,isolate有單獨的內存堆,相互之間不可訪問
經過typedef關鍵字,可定義函數的具體(參數、返回值)類型:
typedef Compare<T> = int Function(T a, T b);
int sort(int a, int b) => a - b;
void main() {
assert(sort is Compare<int>); // True!
}
複製代碼