Flutter(Dart)
Flutter(Dart)
概述
強型別語言、靜態型別
- 指定變數的型別
- 編譯器編譯時期就進行了檢查(型別安全)
面向物件
- OC、JAVA、Dart
JIT&AOT
- 即時編譯,開發期間。更快編譯更快過載
- 事前編譯,release期間,更快更流暢
基礎
資料型別
-
數字
- num
- int
- double
-
字串 String
-
subString(1,5)
- 字串擷取
-
indexOf(“XX”)
- xx:獲取指定字串位置
-
startWith
- 判斷開始位置的字串
-
replaceAll
- 替換指定地字串
-
etc:檢視文件,當需要的時候
-
-
布林 bool
-
強型別檢查
- 只有bool的型別的值是true 才被認為是true
-
-
集合 List
-
List list = [1,2,‘集合’]
-
List listInt = [‘String’] 使用泛型,強型別檢查後,編譯期間直接拋錯
-
listInt = list; //build 期間之間拋錯 (錯誤做法,型別轉換錯誤)
-
remove
-
insert
-
sublist
-
indexOf
-
通過迭代器的形式:
-
遍歷
-
for
-
for in
- for(val obj in list){}
-
forEach
- list.forEach( (val){//語句xxx} )
-
-
-
Map
-
Map 是將Key和value 相關聯的物件,key 和value 都可以是任何型別的物件,並且key是唯一的如果後來有從重複的則會把前邊的key進行覆蓋
-
初始化
- Map names = {“name1”:“bean”}
- Map ages = {}; ages[“key1”] = value1
-
遍歷
-
for (var key in ages.keys){
print(’$key ${ages[key]}’);
} -
呼叫map 方法生生成新的map
- Map ages2 = ages.map((k,v){
//迭代生成一個新Map
return MapEntry(v, k);//和之前的MAP的K,V 剛好相反
});
- Map ages2 = ages.map((k,v){
-
forEach
- names.forEach((k, v ){
print(‘ k , k, k,v’);
});
- names.forEach((k, v ){
-
-
-
混淆點
-
Object
-
Dart基類
- 只能呼叫Object 存在的方法
- 型別可以被反覆修改
- 和dynamic唯一的區別是在靜態型別檢查上
-
-
dynamic
-
物件的基礎型別,資料型別可以反覆被修改
- 通常不使用,原因是靜態型別檢查不會拋錯,執行時會crash,
-
-
var
- 一旦定義,不允許被修改。(系統會動態推斷資料型別)
-
面向物件
封裝、繼承、多型(過載)
類(重要)預設繼承:Object
-
物件
-
變數
- 私有變數定義 _privateVar
-
方法
-
構造方法 (是方法的一種)
-
標準構造方法
- Person(this.xx , this.xx)
-
初始化列表
-
除了呼叫父類構造器,在子類構造方法體之前,可以初始化例項變數,不同的初始化變數之間用逗號分割
- Student(this._school, String name, int age, {this.city,this.country = “china”}) : name = ‘$country and $city’, super(name, age){
print(‘方法體不是必須的’);
}
- Student(this._school, String name, int age, {this.city,this.country = “china”}) : name = ‘$country and $city’, super(name, age){
-
如果父類沒有預設構造的方法(無參的構造方法),則需要在初始化列表中呼叫父類的構造方法進行初始化
-
方法體可省略
-
-
命名構造方法
- 結構[類名+.+方法名]
- 先使用父類的構造方法進行初始化
- 是一種特殊的構造方法(針對flutter而言)
- 方法體可以省略
-
工廠構造方法
- factory 標識
- 唯一例項
- 更像是其他語言裡邊的單例:大多約定使用static
- 更像是一種模式
- 使用工廠模式來定義構造方法就稱為工廠構造方法
-
命名工廠構造方法
- 網路請求,資料解析時候會經常用到
- factory [類名+.+方法名]
- 可以又返回值,不需要講類的final變數作為引數,是提供一種靈活獲取類物件的方式。
-
可選引數/預設引數
- 預設引數一定是可選引數
- 初始化的時候需要使用 {} 包括起來
- 非構造方法獨有,其他的方法也可以使用
-
-
例項方法
- 除了構造方法外都是例項方法
-
setters 和 getters
-
讓外界對內部屬性進行設值/獲取值
- String get => _school
- set school(String vlue){_school = value}
-
-
靜態方法
- static myPrintFun(){ print(‘msg is print’) }
- 類名+方法 進行呼叫
-
抽象
-
抽象類
- abstract 關鍵字修飾
- 抽象類不能被例項化
- 定義介面的時候比較常用。類似與虛基類
- 類可以沒有抽象方法,如果有抽象方法則是抽象類
-
抽象方法
- 在抽象類裡邊存在的方法,稱為抽象方法
mixins
-
必須繼承Ojbect
-
不能有構造方法
-
不能呼叫super
-
特性是可以快速複用程式碼
-
使用mixins
- 需要在with關鍵字後邊跟上一個或多個mixins的名字《逗號分割》
- with要用在extends後邊
泛型
可以提高型別檢測
提高了類、介面、方法的複用性
對不特定資料型別的支援
泛型類、構造方法中也可以使用泛型、泛型方法
非同步
async await
Future
Stream
技巧
善於使用封裝達到儘可能少的程式碼做更多的事情(複用)
繼承(快速的使用其它類已經實現的程式碼)
多型(主要是方法的重用、過載)
點點點技巧
- 例如:寫了一個類,然後使用.的方式檢視這個類有什麼屬性和方法
- 通過點選方法進去看看方法具體的實現已經之間的關係
- 如果之間存在著繼承或者深層巢狀,則積蓄點進去,進行檢視類之間的關係
關於異常的判斷
-
可以使用?.的形式 避免訪問時候crash
- 例如List list = List();
- list.length則會crash
- list?.length則不會
-
可以使用?? 提供一個預設值
-
也可以使用陣列的形式判斷多個條件的匹配
- 例如:["",null,]
學習資料
http://dart.goodev.org/guides/language/effective-dart
https://dart.dev/guides/language/language-tour
https://dart.dev
函式/方法
方法構成
-
返回值
-
引數
- 普通引數
- 可選引數
- 引數預設值
方法型別
-
入口方法
- main 方法
-
構造方法
- 初始化類變數的方法
-
例項方法
-
setters/getters
-
靜態方法
-
抽象方法
-
私有方法
-
匿名方法
-
泛型方法
心得
Dart的類名字為大寫,但檔名字一般都為小寫(區別於其他的檔案 )
下劃線可以標示私有方法、類、變數
不像是OC,沒有*號的概念,在建立物件的時候
Floating Topic
XMind - Trial Version