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

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

前言

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

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

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

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

正文

  1. 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ǔ)充~

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 227,818評(píng)論 6 531
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 98,185評(píng)論 3 414
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 175,656評(píng)論 0 373
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我,道長(zhǎng),這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 62,647評(píng)論 1 309
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 71,446評(píng)論 6 405
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 54,951評(píng)論 1 321
  • 那天,我揣著相機(jī)與錄音,去河邊找鬼。 笑死,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,041評(píng)論 3 440
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 42,189評(píng)論 0 287
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 48,718評(píng)論 1 333
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 40,602評(píng)論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 42,800評(píng)論 1 369
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,316評(píng)論 5 358
  • 正文 年R本政府宣布,位于F島的核電站,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 44,045評(píng)論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,419評(píng)論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,671評(píng)論 1 281
  • 我被黑心中介騙來泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 51,420評(píng)論 3 390
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 47,755評(píng)論 2 371

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