Flutter 入門指北(Part 1)之 Dart

該文已授權公眾號 「碼個蛋」题翰,轉載請指明出處

最近 Flutter 真心火爆到不要不要的拙泽,隨大流荆烈,學一波拯勉,在這之前,對于語言的語法還是需要有些必要的了解的憔购,Dart 這門語言宫峦,說實話對于會 Java 這類面向對象的語言的小伙伴們來說,真的灰趁的瘢灰常簡單导绷,這邊我總結了一些 DartJava 的一些語法差異,當然屎飘,只是部分妥曲,但是贾费,按照我目前的學習進度來說,了解了這些對于寫 Flutter 項目絕對夠了檐盟。小伙伴也可以自己查看褂萧,我這邊提供一個自己學習的網(wǎng)址 Dart 快速入門

溫馨提示:本篇文章沒有圖,沒有圖葵萎,沒有圖导犹,可能會造成部分不適,請注意羡忘,請注意谎痢,請注意,系好安全帶卷雕,我們要「開車了」......

1. Variables

Dart 變量類型可以通過具體的賦值進行推導节猿,例如:var name = 'kuky' 則定義了一個 String 類型對象 name,也可以通過指定具體的類型 String name = 'kuky'爽蝴,如果沒有初始化變量沐批,則默認值為 null,類型為數(shù)字的變量默認值同為 nulljava 不同蝎亚,javaint 默認為 0.)如果需要定義常量,可以通過 finalconst 進行定義先馆,final 變量只能賦值一次发框,const 是編譯時常量。

2. Build-in-types

Dart 內(nèi)置類型包括 :

  • Numbers 包括 int[-2^53 ~ 2^53]煤墙, double[64-bit 浮點數(shù)]

  • Strings Dart 字符串是 UTF-16 編碼的字符序列梅惯, 可以使用單引號或者雙引號來創(chuàng)建字符串。

    1. 通過 == 判斷兩個字符串是否相同
    2. 通過三對單引號'''aaa'''或者雙引號"""aaa"""可以創(chuàng)建多行字符串對象
    3. 使用前綴 r 創(chuàng)建 raw string仿野,字符串內(nèi)不會進行轉義铣减,例如:var a = r'haha \n breakLine' 打印 a 對象則會按照輸入的輸出,不會進行換行
  • Booleans Dart 中脚作,只有 true 對象才被認為是 true葫哗, 所有其他的值都是 false

  • Lists 列表,例如:var list = [1, 2, 3, 4]

    ? 通過 const 關鍵詞可以定義一個不可變列表 var list = const [1, 2, 3, 4]

    ? 參數(shù)化定義var name = <String>['Jone', 'Jack']

  • Maps 鍵值對球涛,例如:var map = {'one': 1, 'two': 2}

    ? 如果鍵值對需要添加新的鍵值對劣针,直接指定即可,map['three'] = 3亿扁,若查找的鍵不存在捺典,返回 null

    ? 參數(shù)化定義 var map = <String, int>{'one': 1, 'two': 2}

  • Runes 代表字符串的 UTF-32 code points干旁,通常使用 \uXXXX 的方式來表示 Unicode code point部念, XXXX 是4個 16 進制的數(shù)腻豌,例如 \u2665 返回心形符號 ()

  • Symbols 代表 Dart 程序中聲明的操作符或者標識符厦画,幾乎不使用

3. Function

函數(shù)方法的可選參數(shù)通過在參數(shù)列表中用 {} 指定,例如:

void say(String name, {String word = 'hello'}){
    print('$name say $word');
  }

// 通過(可選參數(shù)名 + :)進行可選參數(shù)的賦值
main(){
    say('kuky', word: 'Hello World'); // kuky say Hello World
}

word 參數(shù)為可選參數(shù)擎浴,默認值為 hello

4. Operators

操作符幾乎和別的語言類似煌张,提個比較特殊的賦值操作符 ??=?.操作符

var a = 1;
var b;
b ?? = a; // 如果 b 的值是 null 則將 a 賦值給 b,否則保持不變
var c = size?.x; // 如果 size 為 null 則返回 null退客,否則返回 size.a 的值
5. Conditional Expressions

Dart 可以通過兩個特殊的操作符替換 if(){} else{} 表達式

/// condition? expr1: expr2 同 java 三目運算符
var a = -1;
a = a < 0 ? -1 : a;
/// expr1 ?? expr2 
String toString() => msg ?? super.toString() // 如果 expr1 不為 null 則返回 expr1 否則返回 expr2
6. Cascade Notaion(..)

級聯(lián)操作符 (..) 可以在同一個對象上 連續(xù)調(diào)用多個函數(shù)以及訪問成員變量

class Size{
    double x;
    double y;

  @override
  String toString() {
    return 'Size{x: $x, y: $y}';
  }
}

var size = Size();
/// 通過級聯(lián)操作符進行賦值骏融,可以更加簡潔,!!如果函數(shù)返回值為 void 則不能進行級聯(lián)!!
print(size
      ..x = 10
      ..y = 100
      ..toString()); /// 輸出 Size{x: 10.0, y: 100.0}
7. foreach

通過 foreach 循環(huán)遍歷一個實現(xiàn) Iterable 接口的對象

var items = [1, 2, 3, 4, 5];
var maps = {'a': 1, 'b': 2};

items.where((i) => i > 2).forEach((i) => print(i));  // 3, 4, 5
maps.forEach((key, value) => print('$key => $value')); // a => 1, b => 2
8. Switch and case

如果需要實現(xiàn)繼續(xù)到下一個 case 語句中繼續(xù)執(zhí)行萌狂,則可以 使用 continue 語句跳轉到對應的標簽處繼續(xù)執(zhí)行

var command = 'Close';
switch (command.toLowerCase()) {
  case 'close':
    print('close');
    continue open;
        
  open: // 這是個標簽
  case 'open':
    print('open');
    break;
}
9. Assert

如果條件表達式結果不滿足需要档玻,則可以使用 assert 語句倆打斷代碼的執(zhí)行,例如:assert(a == 1);

10. Exceptions

所有的 Dart 異常是非檢查異常茫藏。捕捉 exceptions 的時候可以通過 on 指定 exceptions 類型误趴,再使用 catch 捕獲

try {
  breedMoreLlamas();
} on OutOfLlamasException {
  buyMoreLlamas();
} on Exception catch (e) {
  print('Unknown exception: $e');
} catch (e, s) { // 函數(shù) catch 可以帶有一個或兩個參數(shù),第一個參數(shù)為拋出的異常對象务傲,第二個為堆棧信息
  print('Something really unknown: $e');
  print('Stack trace:\n $s');
  rethrow; // 通過 rethrow 可以將異常重新拋出
}
11. Classes

Dart 中的類都是單繼承凉当,但是同時支持 mixin 的繼承機制(Object 類,每個類都只有一個超類)售葡,所有的類都繼承于 Object看杭,通過調(diào)用 runtimeType 判斷實例的類型。每個實例變量都會自動生成一個 getter 方法(隱含的)挟伙, Non-final 實例變量還會自動生成一個 setter 方法楼雹。

  • Constructors

    Dart 的構造函數(shù)同 Java 類似

    class Size {
      num x, y;
    
      Size(num nx, num y){
        x = nx;
        this.y = y; // this 關鍵字只有當名字沖突時候使用,否則 Dart 推薦省略 this
      }
        
      Size(this.x, this.y); // Dart 通過語法糖省略了構造函數(shù)的賦值過程尖阔,效果同上
    }
    

    如果沒有定義構造函數(shù)贮缅,則會有個默認構造函數(shù)。默認構造函數(shù)沒有參數(shù)介却,并且會調(diào)用超類的 沒有參數(shù)的構造函數(shù)谴供。子類不會繼承超類的構造函數(shù),子類如果沒有定義構造函數(shù)齿坷,則只有一個默認構造函數(shù)桂肌。

    Dart 通過命名構造函數(shù)為類創(chuàng)建多個構造函數(shù),同時指明意圖

    class Size {
      num x, y;
    
      Size(this.x, this.y);
    
      Size.fromJson(Map json){
        this.x = json['x'];
        this.y = json['y'];
      } // 因為構造函數(shù)不能繼承胃夏,如果希望子類也有超類一樣的命名構造函數(shù)轴或,必須在子類中實現(xiàn)該構造函數(shù)
      
      // 構造函數(shù)體執(zhí)行之前除了可以調(diào)用超類構造函數(shù)之外,還可以初始化實例參數(shù)
      // 初始化列表非常適合用來設置 final 變量的值
      Size.fromJsonInit(Map json)
          : this.x = json['x'],
            this.y = json['y'];
    }
    

    常量構造函數(shù)(如果類需要提供一個狀態(tài)不變的對象仰禀,通過 const 構造函數(shù)實現(xiàn))

    class ConstPoint {
      final num x;
      final num y;
    
      const ConstPoint(this.x, this.y);
    }
    

    工廠方法構造函數(shù)(如果一個類不需要每次都提供一個新的對象照雁,通過 factory 構造函數(shù)實現(xiàn))

    class HttpCore {
      HttpCore._internal();
    
      factory HttpCore() {
        if (_instance == null) _instance = HttpCore._internal();
        return _instance;
      }
    
      static HttpCore _instance;
    
      static HttpCore get instance => HttpCore();
      
      void _request(){
          //...
      }
    }
    
  • 每個類都隱式的定義了一個包含所有實例成員的接口, 并且這個類實現(xiàn)了這個接口,通過抽象類實現(xiàn)類似 Java 接口的功能饺蚊。

    abstract class Callback {
      void print(String msg);
    }
    
    class A implements Callback{
      @override
      void print(String msg) {
        print(msg);
      }
    }
    
  • Mixins Dart | 什么是Mixin

12. Asynchrony support
  1. Future

    loopIntegers() {
      // 通過 then 進行獲取到 Future 對象后的操作
      getListDelay().then((ints) => ints.forEach((i) => print(i)));
    }
    
    // 生成一個 Future 對象
    Future<List<int>> getListDelay() {
      return Future.delayed(Duration(seconds: 2), () => List.generate(10, (delta) => delta));
    }
    

    通過 async await 簡化 Future 操作

    runUsingFuture() {
      //...
      findEntrypoint().then((entrypoint) {
        return runExecutable(entrypoint, args);
      }).then(flushThenExit);
    }
    
    // 簡化了 then
    runUsingAsyncAwait() async {
      //...
      var entrypoint = await findEntrypoint();
      var exitCode = await runExecutable(entrypoint, args);
      await flushThenExit(exitCode);
    }
    

    有時候要求調(diào)用很多異步方法萍诱,并且等待 所有方法完成后再繼續(xù)執(zhí)行,通過使用 Future.wait() 進行管理

    Future deleteDone = deleteLotsOfFiles();
    Future copyDone = copyLotsOfFiles();
    Future checksumDone = checksumLotsOfOtherFiles();
    
    Future.wait([deleteDone, copyDone, checksumDone])
        .then((List values) {
          print('Done with all the long steps');
        });
    
  2. Stream Dart|什么是 Stream

大概了解了 Dart 的語法污呼,下節(jié)就開始寫 Flutter 啦~裕坊,環(huán)境的安裝具體查看官網(wǎng),很詳細 Flutter 環(huán)境安裝 記得一定要配置鏡像燕酷,配置鏡像籍凝,配置鏡像

最后編輯于
?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市苗缩,隨后出現(xiàn)的幾起案子饵蒂,更是在濱河造成了極大的恐慌,老刑警劉巖酱讶,帶你破解...
    沈念sama閱讀 222,681評論 6 517
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件退盯,死亡現(xiàn)場離奇詭異,居然都是意外死亡泻肯,警方通過查閱死者的電腦和手機渊迁,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,205評論 3 399
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來灶挟,“玉大人琉朽,你說我怎么就攤上這事「嘞簦” “怎么了漓骚?”我有些...
    開封第一講書人閱讀 169,421評論 0 362
  • 文/不壞的土叔 我叫張陵,是天一觀的道長榛泛。 經(jīng)常有香客問我,道長噩斟,這世上最難降的妖魔是什么曹锨? 我笑而不...
    開封第一講書人閱讀 60,114評論 1 300
  • 正文 為了忘掉前任,我火速辦了婚禮剃允,結果婚禮上沛简,老公的妹妹穿的比我還像新娘。我一直安慰自己斥废,他們只是感情好椒楣,可當我...
    茶點故事閱讀 69,116評論 6 398
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著牡肉,像睡著了一般捧灰。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上统锤,一...
    開封第一講書人閱讀 52,713評論 1 312
  • 那天毛俏,我揣著相機與錄音炭庙,去河邊找鬼。 笑死煌寇,一個胖子當著我的面吹牛焕蹄,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播阀溶,決...
    沈念sama閱讀 41,170評論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼腻脏,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了银锻?” 一聲冷哼從身側響起永品,我...
    開封第一講書人閱讀 40,116評論 0 277
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎徒仓,沒想到半個月后腐碱,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,651評論 1 320
  • 正文 獨居荒郊野嶺守林人離奇死亡掉弛,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,714評論 3 342
  • 正文 我和宋清朗相戀三年症见,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片殃饿。...
    茶點故事閱讀 40,865評論 1 353
  • 序言:一個原本活蹦亂跳的男人離奇死亡谋作,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出乎芳,到底是詐尸還是另有隱情遵蚜,我是刑警寧澤,帶...
    沈念sama閱讀 36,527評論 5 351
  • 正文 年R本政府宣布奈惑,位于F島的核電站吭净,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏肴甸。R本人自食惡果不足惜寂殉,卻給世界環(huán)境...
    茶點故事閱讀 42,211評論 3 336
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望原在。 院中可真熱鬧友扰,春花似錦、人聲如沸庶柿。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,699評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽浮庐。三九已至甚负,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背腊敲。 一陣腳步聲響...
    開封第一講書人閱讀 33,814評論 1 274
  • 我被黑心中介騙來泰國打工击喂, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人碰辅。 一個月前我還...
    沈念sama閱讀 49,299評論 3 379
  • 正文 我出身青樓懂昂,卻偏偏與公主長得像,于是被迫代替她去往敵國和親没宾。 傳聞我的和親對象是個殘疾皇子凌彬,可洞房花燭夜當晚...
    茶點故事閱讀 45,870評論 2 361