iOSer 的 Flutter 快速入坑之道(一)
前言
本文適用于有一定 iOS 開發(fā)經(jīng)驗,然后對于 Flutter 是初學(xué)階段的同學(xué)。
學(xué)習(xí)前置項:
- 了解什么是 flutter仆嗦,大概了解 Flutter 的一些特性。
- 已經(jīng)完成 Dart 語言基本語法的學(xué)習(xí)先壕。
- 已經(jīng)搭建好 Flutter 的 IDE瘩扼。
好,具備以上幾點垃僚,那么下面我就不多說有的沒的邢隧,直接帶你躺到 Flutter 的坑里,快速實現(xiàn)原生iOS 到 Flutter 的過渡冈在。
正文
-
Dart 語法
dart 的基本語法不再一一贅述,但是為了方便之后的學(xué)習(xí)按摘,在這里再復(fù)習(xí)一下一些相對比較重要和常用的語法知識包券。
a. 變量類型聲明
dart 是屬于強類型的語言,但是變量的聲明可以用 var炫贤,用 var 聲明的變量溅固,dart 會自動推導(dǎo)出變量類型。比如
var x = 1 //int整形 var y = 1.0 //double型 var z = "string" //string 字符串類型
但是當(dāng)比如上述的 x 和 y 被分別推導(dǎo)成 int 和 double 類型之后兰珍,如果你嘗試把 x 和 y 相加侍郭,編譯器就會報錯,因為兩者已經(jīng)是不同的類型了掠河。
而 dynamic 關(guān)鍵字和 oc 中的 dynamic 用法相同亮元,都是指把類型聲明為動態(tài)類型,在編譯期間不進(jìn)行類型檢查唠摹,到了運行時才進(jìn)行類型檢查爆捞。
b. 容器類型(數(shù)組、字典勾拉、集合)
在 iOS 中煮甥,Array、Dictionary藕赞、Set 都是十分常用的數(shù)據(jù)結(jié)構(gòu)成肘,那么在 dart 中,對映的數(shù)據(jù)結(jié)構(gòu)叫什么及怎么使用呢斧蜕?
List
List 在 dart 就是用于構(gòu)建列表双霍、數(shù)組的數(shù)據(jù)結(jié)構(gòu),對應(yīng)于 Array。
var list = List<int>(); list.add(1); list.remove(1); list.removeAt(0); ...
基本的增刪改查方法都差不多店煞,沒有什么區(qū)別蟹演。
Map
Map 在 dart 中就是對應(yīng)于字典的數(shù)據(jù)結(jié)構(gòu),用于一些 key-value 類型的存儲顷蟀。
var map = Map<String, int>(); map['one'] = 1; map['two'] = 2; var map = const { 'one' : 1, 'two' : 2, }; ...
Set
dart 中的集合還是叫做 Set酒请,這個沒有變化。他的基本使用如下:
var set = Set<String>(); set.add('one'); set.remove('one'); set.difference(set2); ...
三種容器的基本使用方法還是沒有變化鸣个,在具體的方法調(diào)用上也只有細(xì)微的羞反,在方法命名上以及健全度方面有所差別。
c. 函數(shù)
在 iOS 中一個普通的函數(shù)實現(xiàn)可能如下:
- (int)addA:(int) a withB:(int) b { return a + b; }
那么囤萤,在 dart 中昼窗,函數(shù)寫法還是像 C 語言的函數(shù)結(jié)構(gòu)的
int add(int a, int b) { return a+b; }
沒錯,這并沒有什么涛舍,知道怎么寫就ok了澄惊。
另外值得一提的一個點是,在 dart 中對于類似上面函數(shù)富雅,內(nèi)容只有一個 return 的情況掸驱,我們可以用 => 的語法來完成函數(shù)的簡化。如:int add(int a, int b) => a+b;
然后在 dart 中如果在函數(shù)名前加下劃線_没佑,就代表這個函數(shù)是私有函數(shù)毕贼,不能被外部訪問,否則默認(rèn)就是公有方法蛤奢。同樣鬼癣,下劃線的規(guī)則對于成員變量同樣適用。
d. 匿名函數(shù)/block
匿名函數(shù)的結(jié)構(gòu)大致如下
([[Type] param1[, …]]) { codeBlock; };
最簡單的匿名函數(shù)就是沒有參數(shù)啤贩,返回值也為 void 的函數(shù):
(){ print('print aaa'); };
e. Class
dart 是面向?qū)ο蟮恼Z言待秃,所有的類都繼承自 Object,就算 int痹屹、double 類型也都是一個對象锥余。
類的可以使用 new 和構(gòu)造函數(shù)來初始化,這個和 java 還是比較類似的痢掠。
比如基本的構(gòu)造函數(shù)方法有class Point { num x; num y; Point(num x, num y) { this.x = x; this.y = y; }//標(biāo)準(zhǔn)構(gòu)造函數(shù) Point(this.x, this,y); //標(biāo)準(zhǔn)構(gòu)造函數(shù)語法糖 Point.fromJson(Map json){ x = json['x']; y = json['y']; } //命名構(gòu)造函數(shù) Point.fromJson2(num x): this(x, 0); //重定向構(gòu)造函數(shù) }
除了以上的構(gòu)造函數(shù)驱犹,針對構(gòu)造函數(shù)并不總是 new 一個對象出來的情況,還可以采用 factory 工廠模式的構(gòu)造函數(shù)足画,有興趣自行查詢雄驹。
在類的使用中有一些便捷的語法,這里簡單介紹一下淹辞。
在 dart 中医舆,有類似 swift 可選值的操作,比如
p?.y = 1;
使用 ?.來代替. 可以在當(dāng)左邊 p 為 null 時蔬将,不進(jìn)行 y 的賦值爷速,從而避免異常情況的發(fā)生。只有在 p 不為空時才進(jìn)行后續(xù)的賦值操作霞怀。
f.get-set方法
在 dart 中惫东,get set 方法寫法如下:num get right => left + width; set right(num value) => left = value - width;
其實就是在返回值和方法名中間插入 get 或者 set 關(guān)鍵字。
g.繼承毙石、接口和mixin
在 dart 中類的繼承是在類的聲明之后加上 extends 的關(guān)鍵字
廉沮,示例如下:class A extends B { }
繼承沒什么區(qū)別,無非是寫法不同徐矩。但是在接口這方面滞时,dart 中不存在特別的協(xié)議關(guān)鍵字,也就是沒有 protocal 用于定義協(xié)議滤灯。那么在 dart 中坪稽,其實每個類都有隱式地定義了包含所有實例成員的接口,并且這個類實現(xiàn)了這個接口鳞骤。也就是說刽漂,在 dart 中,類的聲明可以當(dāng)作接口來使用弟孟,如
class A implements B { }
當(dāng)然在 dart 中,繼承也是只能單繼承样悟,可以同時遵循多個接口拂募。
然后說 Mixin,Mixins 是一種在多類繼承中重用一個類代碼的方法窟她。使用 with 關(guān)鍵字后面為一個或者多個 mixin 名字來使用 mixin陈症。
abstract class Musical {
bool canPlayPiano = false;
bool canCompose = false;
bool canConduct = false;
void entertainMe() {
if (canPlayPiano) {
print('Playing piano');
} else if (canConduct) {
print('Waving hands');
} else {
print('Humming to self');
}
}
}
如上,沒有構(gòu)造函數(shù)震糖,那么這個類就是一個 mixin录肯,下面示例顯示了如何使用 mixin。
class A extends B with Musical {
entertainMe();
}
h. 異步
dart 是單線程的語言吊说,所以在異步的用法上论咏,主要通過 async 和 await 的關(guān)鍵字來實現(xiàn)。概念上可以理解為和協(xié)程類似颁井。
checkVersion() async {
var version = await lookUpVersion();
if (version == expectedVersion) {
// Do something.
} else {
// Do something else.
}
}// 在使用 await 的函數(shù)中厅贪,必須用 async 來修飾。
如果聲明了一個異步方法雅宾,那么該方法需要用 async 修飾养涮,并且返回值是 Future 類型的。
如:
String lookUpVersionSync() => '1.0.0';
//同步方法
Future<String> lookUpVersion() async => '1.0.0';
//異步方法
在 dart 語法上暫時就說這些,其他的語法還是需要自己系統(tǒng)性地去學(xué)習(xí)贯吓。這里提供一個類似 playground 的懈凹,專門用于跑 dart 代碼的平臺,可以在一邊學(xué)習(xí)語法的同時一邊動手測試:DartPad
最后
其實這真的不是最后悄谐,本篇主要介紹了一些 dart 的語法介评,由于考慮到內(nèi)容實在很多,所以還是想分成幾篇來發(fā)尊沸,這樣也便于以后有其他 flutter 相關(guān)知識點的補充~