Dart學(xué)習(xí)基礎(chǔ)筆記

Dart語言詳解


變量-變量的聲明

區(qū)別于java,新增 var dynamic Object

var:如果沒有初始值,可以變成任何類型

dynamic:動態(tài)任意類型,編譯階段不檢查類型

Object:動態(tài)任意類型,編譯階段檢查檢查類型

區(qū)別:

唯一區(qū)別 var 如果有初始值,類型被鎖定,沒有初始化的變量自動獲取一個默認(rèn)值為null,一切皆對象(此對象 非彼對象),對象的默認(rèn)值為null

變量-final和const

共同點:

1.聲明的類型可省略

2.初始化后不能再賦值

3.不能和var同時使用

區(qū)別:

1.類級別常量,使用static const

2.const可使用其他const 常量的值來初始化其值

3.使用const賦值聲明,const可省略

4.可以更改非final、非const變量的值,即使曾經(jīng)具有const值

5.const導(dǎo)致的不可變性是可傳遞的

6.相同的const常量不會在內(nèi)存中重復(fù)創(chuàng)建

7.const需要是編譯時常量

內(nèi)置類型

Numbers 數(shù)值、Strings 字符串、Booleans 布爾值、Lists 列表(數(shù)組)、Sets 集合、Maps 集合、Runes 符號字符、Symbols 標(biāo)識符、int : 整數(shù)值、double : 64-bit雙精度浮點數(shù)、int和double是num的子類。

特殊講解String:

Dart 字符串是 UTF-16 編碼的字符序列,可以使用單引號或者雙引號來創(chuàng)建字符串,可以使用三個單引號或者雙引號創(chuàng)建多行字符串對象,可以使用 r 前綴創(chuàng)建”原始raw”字符串,可以在字符串中使用表達(dá)式: ${expression},如果表達(dá)式是一個標(biāo)識符,可以省略 {},如果表達(dá)式的結(jié)果為一個對象,則 Dart 會調(diào)用對象的 toString() 函數(shù)來獲取一個字符串

內(nèi)置類型-List:

Dart中可以直接打印list包括list的元素,List也是對象。java中直接打印list結(jié)果是地址值

Dart中List的下標(biāo)索引和java一樣從0開始和java一樣支持泛型。

有增刪改查,支持倒序,自帶排序、洗牌,可使用+將兩個List合并

內(nèi)置類型-Set:

set1.difference(set2):返回set1集合里有但set2里沒有的元素集合

set1.intersection(set2):返回set1和set2的交集

set1.union(set2):返回set1和set2的并集

set1.retainAll():set1只保留某些元素(要保留的元素要在原set中存在)

內(nèi)置類型-Runes:

Main(){

? Runes runes = new Runes('\u{1f605} \u6211‘);

? var str1 = String.fromCharCodes(runes);?

? print(str1);

}

Runes用于在字符串中表示Unicode字符。

使用String.fromCharCodes顯示字符圖形。

如果非4個數(shù)值,需要把編碼值放到大括號中

函數(shù)


函數(shù)定義

1.可在函數(shù)內(nèi)定義

2.定義函數(shù)時可省略類型

3.支持縮寫語法 =>

Dart中函數(shù)是Function類型的對象。

所有的函數(shù)都返回一個值。如果沒有指定返回值,則 默認(rèn)把語句 return null; 作為函數(shù)的最后一個語句執(zhí)行。

定義函數(shù)時可省略類型(不建議)。

對于只有一個表達(dá)式的方法,你可以選擇 使用縮寫語法=>表達(dá)式來定義。(Kotlin是用=來實現(xiàn))

可在函數(shù)內(nèi)部定義函數(shù),支持嵌套。

函數(shù)-可選參數(shù):

1.可選命名參數(shù)

2.可選位置參數(shù)

3.默認(rèn)參數(shù)值

可選命名參數(shù):使用 {param1, param2, …} 的形式來指定命名參數(shù)。

可選位置參數(shù):把可選參數(shù)放到 [] 中,必填參數(shù)要放在可選參數(shù)前面。

可選命名參數(shù)默認(rèn)值(默認(rèn)值必須是編譯時常量),可以使用等號‘=’或冒號’:‘。

Dart SDK 1.21 之前只能用冒號,冒號的支持以后會移除,所以建議使用等號。

可選位置參數(shù)默認(rèn)值(默認(rèn)值必須是編譯時常量),只能使用等號'='。

可使用list或map作為默認(rèn)值,但必須是const。

函數(shù)-匿名函數(shù)

1.可賦值給變量,通過變量調(diào)用

2.可在其他函數(shù)中直接調(diào)用或傳遞給其他函數(shù)

可以通過()調(diào)用,不推薦。

常用的List.forEach()就用的匿名函數(shù)。

test((){

print("匿名函數(shù)");

});

函數(shù)-閉包

Function makeAddFunc(int x) {

? x++;

? return (int y) => x + y;

}

main() {

? var addFunc2 = makeAddFunc(2);

? var addFunc4 = makeAddFunc(4);

? print(addFunc2(3));

? print(addFunc4(3));

}

注:方法體只包含一個語句,可以使用”=>”縮寫。

函數(shù)-函數(shù)別名

typedef Fun1(int a, int b);

typedef Fun2<T, K>(T a, K b);

int add(int a, int b) {

? print('a + b');

? return a + b;

}

定義函數(shù)模版示列:typedef fun = int add(int a, int b);

test(fun param){

fun(a,b);

}

class Demo1 {

? Demo1(int f(int a, int b), int x, int y) {

? ? var sum = f(x, y);

? ? print("sum1 = $sum");

? }

}

class Demo2 {

? Demo2(Fun1 f, int x, int y) {

? ? var sum = f(x, y);

? ? print("sum2 = $sum");

? }

}

class Demo3 {

? Demo3(Fun2<int, int> f, int x, int y) {

? ? var sum = f(x, y);

? ? print("sum3 = $sum");

? }

}

注:typedef給函數(shù)起一個別名,使用比較方便。例如定義一個方法的回調(diào),直接使用別名定義。

沒返回值,則只要參數(shù)匹配就行了,如果定義了返回值,則返回值不一樣會報錯。

操作符:

“?.”,條件成員訪問 和 . 類似,但是左邊的操作對象不能為 null,例如 foo?.bar 如果 foo 為 null 則返回 null,否則返回 bar 成員。

“~/”,除后取整。

“as”,類型轉(zhuǎn)換。

“is”,如果對象是指定類型返回true。

“is!”,如果對象是指定類型返回false。

“??”,雙問號左邊為true返回左邊結(jié)果,否則返回右邊結(jié)果。

“..”,級聯(lián)語法。嚴(yán)格來說, 兩個點的級聯(lián)語法不是一個操作符。 只是一個 Dart 特殊語法。

“??:”,如果左邊是 null,則右邊賦值給左邊;如果不是 null,則左邊的值保持不變

流程控制語句

if else

for, forEach, for-in

while , do-while

switch case

break , continue

Dart中控制流程語句和Java類似。

List和Set等實現(xiàn)了Iterable接口的類支持for-in遍歷元素。


Dart 提供了 Exception 和 Error 類型, 以及一些子類型。還可以定義自己的異常類型。但是,Dart 代碼可以拋出任何非 null 對象為異常,不僅僅是實現(xiàn)了 Exception 或者 Error 的對象。

/ 拋出Exception 對象

// throw new FormatException(‘格式異常');

// 拋出Error 對象

// throw new OutOfMemoryError();

// 拋出任意非null對象

// throw '這是一個異常';

所有的 Dart 異常是非檢查異常。 方法不一定聲明了他們所拋出的異常, 并且你不要求捕獲任何異常。

Dart 代碼可以拋出任何非 null 對象為異常,不僅僅是實現(xiàn)了 Exception 或者 Error 的對象。

異常-捕獲

try {

? throw new OutOfMemoryError();

} on OutOfMemoryError {

? print('沒有內(nèi)存了');

} on Error catch(e) {

? print('Unknown error: $e');

} catch (e, s) {

? print('Exception details: $e');

? print('Stack Trace: $s');

} finally {

? print('end');

}

所有的 Dart 異常是非檢查異常。 方法不一定聲明了他們所拋出的異常, 并且你不要求捕獲任何異常。

Dart 代碼可以拋出任何非 null 對象為異常,不僅僅是實現(xiàn)了 Exception 或者 Error 的對象。

可以使用on 或者 catch 來聲明捕獲語句,也可以 同時使用。使用 on 來指定異常類型,使用 catch 來 捕獲異常對象。

catch() 可以帶有一個或者兩個參數(shù), 第一個參數(shù)為拋出的異常對象, 第二個為堆棧信息 (一個 StackTrace 對象)。

可以使用rethrow把捕獲的異常重新拋出。


類-構(gòu)造函數(shù):

//java中寫法

class Point {

? double x;

? double y;

? Point(int x, int y) {

? ? this.x = x;

? ? this.y = y;

? }

}


//dart建議寫法

class Point {

? num x;

? num y;

? Point(this.x, this.y);

}

類-命名構(gòu)造函數(shù):

class Point {

? num x;

? num y;

? Point(this.x, this.y);

? //命名構(gòu)造函數(shù)

? Point.fromJson(Map json) {

? ? x = json['x'];

? ? y = json['y'];

? }

}

使用命名構(gòu)造函數(shù)可以為一個類實現(xiàn)多個構(gòu)造函數(shù), 或者使用命名構(gòu)造函數(shù)來更清晰的表明你的意圖。

類-重定向構(gòu)造函數(shù):

class Point {

? num x;

? num y;

? Point(this.x, this.y);

? //重定向構(gòu)造函數(shù),使用冒號調(diào)用其他構(gòu)造函數(shù)

? Point.alongXAxis(num x) : this(x, 0);

}

一個重定向構(gòu)造函數(shù)是沒有代碼的,在構(gòu)造函數(shù)聲明后,使用 冒號調(diào)用其他構(gòu)造函數(shù)。

類-初始化列表:

import 'dart:math';

class Point {

? //final變量不能被修改,必須被構(gòu)造函數(shù)初始化

? final num x;

? final num y;

? final num distanceFromOrigin;

? //初始化列表

? Point(x, y)

? ? ? : x = x,

? ? ? ? y = y,

? ? ? ? distanceFromOrigin = sqrt(x * x + y * y);

}

在構(gòu)造函數(shù)體執(zhí)行之前可以初始化實例參數(shù)。 使用逗號分隔初始化表達(dá)式。

初始化列表非常適合用來設(shè)置 final 變量的值。

類-調(diào)用超類構(gòu)造函數(shù):

eg:class Parent {

? int x;

? int y;

? //父類命名構(gòu)造函數(shù)不會傳遞?

? Parent.fromJson(x, y)

? ? ? : x = x,

? ? ? ? y = y {

? ? print('父類命名構(gòu)造函數(shù)');

? }

}

class Child extends Parent {

? int x;

? int y;

? //若超類沒有默認(rèn)構(gòu)造函數(shù), 需要手動調(diào)用超類其他構(gòu)造函數(shù)

? Child(x, y) : super.fromJson(x, y) {

? ? //調(diào)用父類構(gòu)造函數(shù)的參數(shù)無法訪問 this

? ? print('子類構(gòu)造函數(shù)');

? }

? //在構(gòu)造函數(shù)的初始化列表中使用super(),需要把它放到最后

? Child.fromJson(x, y)

: x = x,

? y = y,

? super.fromJson(x, y) {

? ? print('子類命名構(gòu)造函數(shù)');

? }

}

超類命名構(gòu)造函數(shù)不會傳遞,如果希望使用超類中定義的命名構(gòu)造函數(shù)創(chuàng)建子類,則必須在子類中實現(xiàn)該構(gòu)造函數(shù)。

如果超類沒有默認(rèn)構(gòu)造函數(shù), 則你需要手動的調(diào)用超類的其他構(gòu)造函數(shù)。

調(diào)用超類構(gòu)造函數(shù)的參數(shù)無法訪問 this。

在構(gòu)造函數(shù)的初始化列表中使用 super(),需要把它放到最后。


類-常量構(gòu)造函數(shù):

class Point2 {

? //定義const構(gòu)造函數(shù)要確保所有實例變量都是final

? final num x;

? final num y;

? static final Point2 origin = const Point2(0, 0);

? //const關(guān)鍵字放在構(gòu)造函數(shù)名稱之前,且不能有函數(shù)體

? const Point2(this.x, this.y);

}

定義const構(gòu)造函數(shù)要確保所有實例變量都是final。

const關(guān)鍵字放在構(gòu)造函數(shù)名稱之前。

類-工廠構(gòu)造函數(shù):

class Singleton {

? String name;

? //工廠構(gòu)造函數(shù)無法訪問this,所以這里要用static

? static Singleton _cache;

? //工廠方法構(gòu)造函數(shù),關(guān)鍵字factory

? factory Singleton([String name = 'singleton']) =>

? ? ? Singleton._cache ??= Singleton._newObject(name);

? //定義一個命名構(gòu)造函數(shù)用來生產(chǎn)實例

? Singleton._newObject(this.name);

}

注:工廠構(gòu)造函數(shù)是一種構(gòu)造函數(shù),與普通構(gòu)造函數(shù)不同,工廠函數(shù)不會自動生成實例,而是通過代碼來決定返回的實例對象。

如果一個構(gòu)造函數(shù)并不總是返回一個新的對象,則使用 factory 來定義這個構(gòu)造函數(shù)。

工廠構(gòu)造函數(shù)無法訪問this。

類-Setter和Getter:

class Rectangle {

? num left;

? num top;

? num width;

? num height;

? Rectangle(this.left, this.top, this.width, this.height);

? num get right => left + width;

? set right(num value) => left = value - width;

? num get bottom => top + height;

? set bottom(num value) => top = value - height;

}

每個實例變量都隱含的具有一個 getter, 如果變量不是 final 的則還有一個 setter。

可以通過實行 getter 和 setter 來創(chuàng)建新的屬性, 使用 get 和 set 關(guān)鍵字定義 getter 和 setter。

getter 和 setter 的好處是,你可以開始使用實例變量,后來 你可以把實例變量用函數(shù)包裹起來,而調(diào)用你代碼的地方不需要修改。

類-抽象類:

1.abstract關(guān)鍵字修飾class

2,.繼承的方式使用

3.接口的方式使用

不能被實例化,除非定義一個工廠構(gòu)造函數(shù)。

抽象類通常用來定義接口, 以及部分實現(xiàn)。

抽象類通常具有抽象方法,抽象方法不需要關(guān)鍵字,以分號結(jié)束即可。

接口方式使用時,需要重寫抽象類的成員變量和方法,包括私有的。

一個類可以implement一個普通類。Dart任何一個類都是接口。

一個類可以implement多個接口。

類-可調(diào)用類:

class ClassFunction {

? call(String a, String b, String c) => '$a $b $c!';

}

main() {

? var cf = new ClassFunction();

? var out = cf("dongnao","flutter","damon");

? print('$out');

? print(cf.runtimeType);

? print(out.runtimeType);

? print(cf is Function);

}

實現(xiàn)call()方法可以讓類像函數(shù)一樣能夠被調(diào)用。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容