iOSer 的 Flutter 快速入坑之道(一)

iOSer 的 Flutter 快速入坑之道(一)

前言

本文適用于有一定 iOS 開發(fā)經(jīng)驗,然后對于 Flutter 是初學(xué)階段的同學(xué)。

學(xué)習(xí)前置項:

  1. 了解什么是 flutter仆嗦,大概了解 Flutter 的一些特性。
  2. 已經(jīng)完成 Dart 語言基本語法的學(xué)習(xí)先壕。
  3. 已經(jīng)搭建好 Flutter 的 IDE瘩扼。

好,具備以上幾點垃僚,那么下面我就不多說有的沒的邢隧,直接帶你躺到 Flutter 的坑里,快速實現(xiàn)原生iOS 到 Flutter 的過渡冈在。

正文

  1. 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)知識點的補充~

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末威沫,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子洼专,更是在濱河造成了極大的恐慌棒掠,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,968評論 6 482
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件屁商,死亡現(xiàn)場離奇詭異烟很,居然都是意外死亡,警方通過查閱死者的電腦和手機蜡镶,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,601評論 2 382
  • 文/潘曉璐 我一進(jìn)店門雾袱,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人官还,你說我怎么就攤上這事芹橡。” “怎么了望伦?”我有些...
    開封第一講書人閱讀 153,220評論 0 344
  • 文/不壞的土叔 我叫張陵林说,是天一觀的道長。 經(jīng)常有香客問我屯伞,道長腿箩,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,416評論 1 279
  • 正文 為了忘掉前任劣摇,我火速辦了婚禮珠移,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘末融。我一直安慰自己钧惧,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 64,425評論 5 374
  • 文/花漫 我一把揭開白布勾习。 她就那樣靜靜地躺著垢乙,像睡著了一般。 火紅的嫁衣襯著肌膚如雪语卤。 梳的紋絲不亂的頭發(fā)上追逮,一...
    開封第一講書人閱讀 49,144評論 1 285
  • 那天酪刀,我揣著相機與錄音,去河邊找鬼钮孵。 笑死骂倘,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的巴席。 我是一名探鬼主播历涝,決...
    沈念sama閱讀 38,432評論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼漾唉!你這毒婦竟也來了荧库?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,088評論 0 261
  • 序言:老撾萬榮一對情侶失蹤赵刑,失蹤者是張志新(化名)和其女友劉穎分衫,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體般此,經(jīng)...
    沈念sama閱讀 43,586評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡蚪战,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,028評論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了铐懊。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片邀桑。...
    茶點故事閱讀 38,137評論 1 334
  • 序言:一個原本活蹦亂跳的男人離奇死亡伟阔,死狀恐怖孕锄,靈堂內(nèi)的尸體忽然破棺而出蝙云,到底是詐尸還是另有隱情弧烤,我是刑警寧澤,帶...
    沈念sama閱讀 33,783評論 4 324
  • 正文 年R本政府宣布苍匆,位于F島的核電站只洒,受9級特大地震影響纵苛,放射性物質(zhì)發(fā)生泄漏玉吁。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,343評論 3 307
  • 文/蒙蒙 一腻异、第九天 我趴在偏房一處隱蔽的房頂上張望进副。 院中可真熱鬧,春花似錦悔常、人聲如沸影斑。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,333評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽矫户。三九已至,卻和暖如春残邀,著一層夾襖步出監(jiān)牢的瞬間皆辽,已是汗流浹背柑蛇。 一陣腳步聲響...
    開封第一講書人閱讀 31,559評論 1 262
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留驱闷,地道東北人耻台。 一個月前我還...
    沈念sama閱讀 45,595評論 2 355
  • 正文 我出身青樓,卻偏偏與公主長得像空另,于是被迫代替她去往敵國和親盆耽。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 42,901評論 2 345

推薦閱讀更多精彩內(nèi)容