Flutter 入門指北(Part 1)之 Dart

kukyxs發表於2019-04-14

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

最近 Flutter 真心火爆到不要不要的,隨大流,學一波,在這之前,對於語言的語法還是需要有些必要的瞭解的,Dart 這門語言,說實話對於會 Java 這類物件導向的語言的小夥伴們來說,真的灰常灰常簡單,這邊我總結了一些 DartJava 的一些語法差異,當然,只是部分,但是,按照我目前的學習進度來說,瞭解了這些對於寫 Flutter 專案絕對夠了。小夥伴也可以自己檢視,我這邊提供一個自己學習的網址 Dart 快速入門

溫馨提示:本篇文章沒有圖,沒有圖,沒有圖,可能會造成部分不適,請注意,請注意,請注意,繫好安全帶,我們要「開車了」......

1. Variables

Dart 變數型別可以通過具體的賦值進行推導,例如:var name = 'kuky' 則定義了一個 String 型別物件 name,也可以通過指定具體的型別 String name = 'kuky',如果沒有初始化變數,則預設值為 null,型別為數字的變數預設值同為 nulljava 不同,javaint 預設為 0.)如果需要定義常量,可以通過 finalconst 進行定義,final 變數只能賦值一次,const 是編譯時常量。

2. Build-in-types

Dart 內建型別包括 :

  • Numbers 包括 int[-2^53 ~ 2^53], double[64-bit 浮點數]

  • Strings Dart 字串是 UTF-16 編碼的字元序列, 可以使用單引號或者雙引號來建立字串。

    1. 通過 == 判斷兩個字串是否相同
    2. 通過三對單引號'''aaa'''或者雙引號"""aaa"""可以建立多行字串物件
    3. 使用字首 r 建立 raw string,字串內不會進行轉義,例如: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]

    ​ 引數化定義var name = <String>['Jone', 'Jack']

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

    ​ 如果鍵值對需要新增新的鍵值對,直接指定即可,map['three'] = 3,若查詢的鍵不存在,返回 null

    ​ 引數化定義 var map = <String, int>{'one': 1, 'two': 2}

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

  • Symbols 代表 Dart 程式中宣告的操作符或者識別符號,幾乎不使用

3. Function

函式方法的可選引數通過在引數列表中用 {} 指定,例如:

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

// 通過(可選引數名 + :)進行可選引數的賦值
main(){
    say('kuky', word: 'Hello World'); // kuky say Hello World
}
複製程式碼

word 引數為可選引數,預設值為 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(..)

級聯操作符 (..) 可以在同一個物件上 連續呼叫多個函式以及訪問成員變數

class Size{
    double x;
    double y;

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

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

通過 foreach 迴圈遍歷一個實現 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

如果需要實現繼續到下一個 case 語句中繼續執行,則可以 使用 continue 語句跳轉到對應的標籤處繼續執行

var command = 'Close';
switch (command.toLowerCase()) {
  case 'close':
    print('close');
    continue open;
        
  open: // 這是個標籤
  case 'open':
    print('open');
    break;
}
複製程式碼
9. Assert

如果條件表示式結果不滿足需要,則可以使用 assert 語句倆打斷程式碼的執行,例如: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) { // 函式 catch 可以帶有一個或兩個引數,第一個引數為丟擲的異常物件,第二個為堆疊資訊
  print('Something really unknown: $e');
  print('Stack trace:\n $s');
  rethrow; // 通過 rethrow 可以將異常重新丟擲
}
複製程式碼
11. Classes

Dart 中的類都是單繼承,但是同時支援 mixin 的繼承機制(Object 類,每個類都只有一個超類),所有的類都繼承於 Object,通過呼叫 runtimeType 判斷例項的型別。每個例項變數都會自動生成一個 getter 方法(隱含的), Non-final 例項變數還會自動生成一個 setter 方法。

  • Constructors

    Dart 的建構函式同 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 通過語法糖省略了建構函式的賦值過程,效果同上
    }
    複製程式碼

    如果沒有定義建構函式,則會有個預設建構函式。預設建構函式沒有引數,並且會呼叫超類的 沒有引數的建構函式。子類不會繼承超類的建構函式,子類如果沒有定義建構函式,則只有一個預設建構函式。

    Dart 通過命名建構函式為類建立多個建構函式,同時指明意圖

    class Size {
      num x, y;
    
      Size(this.x, this.y);
    
      Size.fromJson(Map json){
        this.x = json['x'];
        this.y = json['y'];
      } // 因為建構函式不能繼承,如果希望子類也有超類一樣的命名建構函式,必須在子類中實現該建構函式
      
      // 建構函式體執行之前除了可以呼叫超類建構函式之外,還可以初始化例項引數
      // 初始化列表非常適合用來設定 final 變數的值
      Size.fromJsonInit(Map json)
          : this.x = json['x'],
            this.y = json['y'];
    }
    複製程式碼

    常量建構函式(如果類需要提供一個狀態不變的物件,通過 const 建構函式實現)

    class ConstPoint {
      final num x;
      final num y;
    
      const ConstPoint(this.x, this.y);
    }
    複製程式碼

    工廠方法建構函式(如果一個類不需要每次都提供一個新的物件,通過 factory 建構函式實現)

    class HttpCore {
      HttpCore._internal();
    
      factory HttpCore() {
        if (_instance == null) _instance = HttpCore._internal();
        return _instance;
      }
    
      static HttpCore _instance;
    
      static HttpCore get instance => HttpCore();
      
      void _request(){
          //...
      }
    }
    複製程式碼
  • 每個類都隱式的定義了一個包含所有例項成員的介面, 並且這個類實現了這個介面,通過抽象類實現類似 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);
    }
    複製程式碼

    有時候要求呼叫很多非同步方法,並且等待 所有方法完成後再繼續執行,通過使用 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 的語法,下節就開始寫 Flutter 啦~,環境的安裝具體檢視官網,很詳細 Flutter 環境安裝 記得一定要配置映象,配置映象,配置映象

相關文章