谷歌大會之後,有不少人諮詢了我 Flutter 相關的問題,其中有不少是和面試相關的,如今一些招聘上也開始羅列 Flutter 相關要求,最後想了想還是寫一期總結吧,也算是 Flutter 的階段複習。
??系統完整的學習是必須需要的,這裡只能幫你總結一些知識點,更多的還請查閱 Dart/Flutter 官網。
本篇主要是知識點總結,如有疑問可點擊各文章鏈接了解詳情,或者查閱我 掘金專欄。
Dart 部分
其實學習過 JavaScript
或者 Java/Kotlin
的人,在學習 Dart
上幾乎是沒什麼難度的,Dart 綜合了動態語言和靜態語言的特性, 這裡主要提供一些不一樣,或者有意思的概念。
- 1、
Dart
屬於是強類型語言 ,但可以用 var
來聲明變數,Dart
會自推導出數據類型,var
實際上是編譯期的「語法糖」。dynamic
表示動態類型, 被編譯後,實際是一個 object
類型,在編譯期間不進行任何的類型檢查,而是在運行期進行類型檢查。
- 2、
Dart
中 if
等語句只支持 bool
類型,switch
支持 String 類型。
- 3、
Dart
中數組和 List
是一樣的。
- 4、
Dart
中,Runes
代表符號文字 , 是 UTF-32 編碼的字元串, 用於如 Runes input = new Runes(u{1f596} u{1f44d});
- 5、
Dart
支持閉包。
- 6、
Dart
中 number 類型分為 int 和 double ,沒有 float 類型。
- 7、
Dart
中 級聯操作符 可以方便配置邏輯,如下代碼:
event
..id = 1
..type = ""
..actor = "";
比較有意思的賦值操作符有:
AA ?? "999" ///表示如果 AA 為空,返回999
AA ??= "999" ///表示如果 AA 為空,給 AA 設置成 999
AA ~/999 ///AA 對於 999 整除
Dart
方法可以設置 參數默認值 和 指定名稱 。
比如: getDetail(Sting userName, reposName, {branch = "master"}){}
方法,這裡 branch 不設置的話,默認是 「master」 。參數類型 可以指定或者不指定。調用效果: getRepositoryDetailDao(「aaa", "bbbb", branch: "dev");
。
Dart
沒有關鍵詞 public
、private
等修飾符,_
下橫向直接代表 private
,但是有 @protected
註解 。
Dart
中的多構造方法,可以通過命名方法實現。
默認構造方法只能有一個,而通過 Model.empty()
方法可以創建一個空參數的類,其實方法名稱隨你喜歡,而變數初始化值時,只需要通過 this.name
在構造方法中指定即可:
class ModelA {
String name;
String tag;
//默認構造方法,賦值給name和tag
ModelA(this.name, this.tag);
//返回一個空的ModelA
ModelA.empty();
//返回一個設置了name的ModelA
ModelA.forName(this.name);
}
Dart
中所有的基礎類型、類等都繼承 Object
,默認值是 NULL
, 自帶 getter
和 setter
,而如果是 final
或者 const
的話,那麼它只有一個 getter
方法,Object
都支持 getter、setter 重寫:
@override
Size get preferredSize {
return Size.fromHeight(kTabHeight + indicatorWeight);
}
assert
只在檢查模式有效,在開發過程中,assert(unicorn == null);
只有條件為真才正常,否則直接拋出異常,一般用在開發過程中,某些地方不應該出現什麼狀態的判斷。
- 14、重寫運算符,如下所示重載
operator
後對類進行 +/- 操作。
class Vector {
final int x, y;
Vector(this.x, this.y);
Vector operator +(Vector v) => Vector(x + v.x, y + v.y);
Vector operator -(Vector v) => Vector(x - v.x, y - v.y);
···
}
void main() {
final v = Vector(2, 3);
final w = Vector(2, 2);
assert(v + w == Vector(4, 5));
assert(v - w == Vector(0, 1));
}
支持重載的操作符 :