iOSer 的 Flutter 快速入坑之道(一)
前言
本文適用于有一定 iOS 開發(fā)經(jīng)驗(yàn),然后對(duì)于 Flutter 是初學(xué)階段的同學(xué)。
學(xué)習(xí)前置項(xiàng):
- 了解什么是 flutter,大概了解 Flutter 的一些特性。
- 已經(jīng)完成 Dart 語(yǔ)言基本語(yǔ)法的學(xué)習(xí)。
- 已經(jīng)搭建好 Flutter 的 IDE。
好,具備以上幾點(diǎn),那么下面我就不多說有的沒的,直接帶你躺到 Flutter 的坑里,快速實(shí)現(xiàn)原生iOS 到 Flutter 的過渡。
正文
-
Dart 語(yǔ)法
dart 的基本語(yǔ)法不再一一贅述,但是為了方便之后的學(xué)習(xí),在這里再?gòu)?fù)習(xí)一下一些相對(duì)比較重要和常用的語(yǔ)法知識(shí)。
a. 變量類型聲明
dart 是屬于強(qiáng)類型的語(yǔ)言,但是變量的聲明可以用 var,用 var 聲明的變量,dart 會(huì)自動(dòng)推導(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 相加,編譯器就會(huì)報(bào)錯(cuò),因?yàn)閮烧咭呀?jīng)是不同的類型了。
而 dynamic 關(guān)鍵字和 oc 中的 dynamic 用法相同,都是指把類型聲明為動(dòng)態(tài)類型,在編譯期間不進(jìn)行類型檢查,到了運(yùn)行時(shí)才進(jìn)行類型檢查。
b. 容器類型(數(shù)組、字典、集合)
在 iOS 中,Array、Dictionary、Set 都是十分常用的數(shù)據(jù)結(jié)構(gòu),那么在 dart 中,對(duì)映的數(shù)據(jù)結(jié)構(gòu)叫什么及怎么使用呢?
List
List 在 dart 就是用于構(gòu)建列表、數(shù)組的數(shù)據(jù)結(jié)構(gòu),對(duì)應(yīng)于 Array。
var list = List<int>(); list.add(1); list.remove(1); list.removeAt(0); ...
基本的增刪改查方法都差不多,沒有什么區(qū)別。
Map
Map 在 dart 中就是對(duì)應(yīng)于字典的數(shù)據(jù)結(jié)構(gòu),用于一些 key-value 類型的存儲(chǔ)。
var map = Map<String, int>(); map['one'] = 1; map['two'] = 2; var map = const { 'one' : 1, 'two' : 2, }; ...
Set
dart 中的集合還是叫做 Set,這個(gè)沒有變化。他的基本使用如下:
var set = Set<String>(); set.add('one'); set.remove('one'); set.difference(set2); ...
三種容器的基本使用方法還是沒有變化,在具體的方法調(diào)用上也只有細(xì)微的,在方法命名上以及健全度方面有所差別。
c. 函數(shù)
在 iOS 中一個(gè)普通的函數(shù)實(shí)現(xiàn)可能如下:
- (int)addA:(int) a withB:(int) b { return a + b; }
那么,在 dart 中,函數(shù)寫法還是像 C 語(yǔ)言的函數(shù)結(jié)構(gòu)的
int add(int a, int b) { return a+b; }
沒錯(cuò),這并沒有什么,知道怎么寫就ok了。
另外值得一提的一個(gè)點(diǎn)是,在 dart 中對(duì)于類似上面函數(shù),內(nèi)容只有一個(gè) return 的情況,我們可以用 => 的語(yǔ)法來完成函數(shù)的簡(jiǎn)化。如:int add(int a, int b) => a+b;
然后在 dart 中如果在函數(shù)名前加下劃線_,就代表這個(gè)函數(shù)是私有函數(shù),不能被外部訪問,否則默認(rèn)就是公有方法。同樣,下劃線的規(guī)則對(duì)于成員變量同樣適用。
d. 匿名函數(shù)/block
匿名函數(shù)的結(jié)構(gòu)大致如下
([[Type] param1[, …]]) { codeBlock; };
最簡(jiǎn)單的匿名函數(shù)就是沒有參數(shù),返回值也為 void 的函數(shù):
(){ print('print aaa'); };
e. Class
dart 是面向?qū)ο蟮恼Z(yǔ)言,所有的類都繼承自 Object,就算 int、double 類型也都是一個(gè)對(duì)象。
類的可以使用 new 和構(gòu)造函數(shù)來初始化,這個(gè)和 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ù)語(yǔ)法糖 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ù),針對(duì)構(gòu)造函數(shù)并不總是 new 一個(gè)對(duì)象出來的情況,還可以采用 factory 工廠模式的構(gòu)造函數(shù),有興趣自行查詢。
在類的使用中有一些便捷的語(yǔ)法,這里簡(jiǎn)單介紹一下。
在 dart 中,有類似 swift 可選值的操作,比如
p?.y = 1;
使用 ?.來代替. 可以在當(dāng)左邊 p 為 null 時(shí),不進(jìn)行 y 的賦值,從而避免異常情況的發(fā)生。只有在 p 不為空時(shí)才進(jìn)行后續(xù)的賦值操作。
f.get-set方法
在 dart 中,get set 方法寫法如下:num get right => left + width; set right(num value) => left = value - width;
其實(shí)就是在返回值和方法名中間插入 get 或者 set 關(guān)鍵字。
g.繼承、接口和mixin
在 dart 中類的繼承是在類的聲明之后加上 extends 的關(guān)鍵字
,示例如下:class A extends B { }
繼承沒什么區(qū)別,無非是寫法不同。但是在接口這方面,dart 中不存在特別的協(xié)議關(guān)鍵字,也就是沒有 protocal 用于定義協(xié)議。那么在 dart 中,其實(shí)每個(gè)類都有隱式地定義了包含所有實(shí)例成員的接口,并且這個(gè)類實(shí)現(xiàn)了這個(gè)接口。也就是說,在 dart 中,類的聲明可以當(dāng)作接口來使用,如
class A implements B { }
當(dāng)然在 dart 中,繼承也是只能單繼承,可以同時(shí)遵循多個(gè)接口。
然后說 Mixin,Mixins 是一種在多類繼承中重用一個(gè)類代碼的方法。使用 with 關(guān)鍵字后面為一個(gè)或者多個(gè) 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ù),那么這個(gè)類就是一個(gè) mixin,下面示例顯示了如何使用 mixin。
class A extends B with Musical {
entertainMe();
}
h. 異步
dart 是單線程的語(yǔ)言,所以在異步的用法上,主要通過 async 和 await 的關(guān)鍵字來實(shí)現(xiàn)。概念上可以理解為和協(xié)程類似。
checkVersion() async {
var version = await lookUpVersion();
if (version == expectedVersion) {
// Do something.
} else {
// Do something else.
}
}// 在使用 await 的函數(shù)中,必須用 async 來修飾。
如果聲明了一個(gè)異步方法,那么該方法需要用 async 修飾,并且返回值是 Future 類型的。
如:
String lookUpVersionSync() => '1.0.0';
//同步方法
Future<String> lookUpVersion() async => '1.0.0';
//異步方法
在 dart 語(yǔ)法上暫時(shí)就說這些,其他的語(yǔ)法還是需要自己系統(tǒng)性地去學(xué)習(xí)。這里提供一個(gè)類似 playground 的,專門用于跑 dart 代碼的平臺(tái),可以在一邊學(xué)習(xí)語(yǔ)法的同時(shí)一邊動(dòng)手測(cè)試:DartPad
最后
其實(shí)這真的不是最后,本篇主要介紹了一些 dart 的語(yǔ)法,由于考慮到內(nèi)容實(shí)在很多,所以還是想分成幾篇來發(fā),這樣也便于以后有其他 flutter 相關(guān)知識(shí)點(diǎn)的補(bǔ)充~