1. 程式人生 > 實用技巧 >Flutter(Dart)

Flutter(Dart)

在這裡插入圖片描述

Flutter(Dart)

概述

強型別語言、靜態型別

  • 指定變數的型別
  • 編譯器編譯時期就進行了檢查(型別安全)

面向物件

  • OC、JAVA、Dart

JIT&AOT

  • 即時編譯,開發期間。更快編譯更快過載
  • 事前編譯,release期間,更快更流暢

基礎

資料型別

  • 數字

    • num
    • int
    • double
  • 字串 String

    • subString(1,5)

      • 字串擷取
    • indexOf(“XX”)

      • xx:獲取指定字串位置
    • startWith

      • 判斷開始位置的字串
    • replaceAll

      • 替換指定地字串
    • etc:檢視文件,當需要的時候

  • 布林 bool

    • 強型別檢查

      • 只有bool的型別的值是true 才被認為是true
  • 集合 List

    • List list = [1,2,‘集合’]

    • List listInt = [‘String’] 使用泛型,強型別檢查後,編譯期間直接拋錯

    • listInt = list; //build 期間之間拋錯 (錯誤做法,型別轉換錯誤)

    • remove

    • insert

    • sublist

    • indexOf

    • 通過迭代器的形式:

    • 遍歷

      • for

      • for in

        • for(val obj in list){}
      • forEach

        • list.forEach( (val){//語句xxx} )
  • Map

    • Map 是將Key和value 相關聯的物件,key 和value 都可以是任何型別的物件,並且key是唯一的如果後來有從重複的則會把前邊的key進行覆蓋

    • 初始化

      • Map names = {“name1”:“bean”}
      • Map ages = {}; ages[“key1”] = value1
    • 遍歷

      • for (var key in ages.keys){
        print(’$key ${ages[key]}’);
        }

      • 呼叫map 方法生生成新的map

        • Map ages2 = ages.map((k,v){
          //迭代生成一個新Map
          return MapEntry(v, k);//和之前的MAP的K,V 剛好相反
          });
      • forEach

        • names.forEach((k, v ){
          print(‘ k , k, k,v’);
          });
  • 混淆點

    • Object

      • Dart基類

        • 只能呼叫Object 存在的方法
        • 型別可以被反覆修改
        • 和dynamic唯一的區別是在靜態型別檢查上
    • dynamic

      • 物件的基礎型別,資料型別可以反覆被修改

        • 通常不使用,原因是靜態型別檢查不會拋錯,執行時會crash,
    • var

      • 一旦定義,不允許被修改。(系統會動態推斷資料型別)

面向物件

封裝、繼承、多型(過載)

類(重要)預設繼承:Object

  • 物件

  • 變數

    • 私有變數定義 _privateVar
  • 方法

    • 構造方法 (是方法的一種)

      • 標準構造方法

        • Person(this.xx , this.xx)
      • 初始化列表

        • 除了呼叫父類構造器,在子類構造方法體之前,可以初始化例項變數,不同的初始化變數之間用逗號分割

          • Student(this._school, String name, int age, {this.city,this.country = “china”}) : name = ‘$country and $city’, super(name, age){
            print(‘方法體不是必須的’);
            }
        • 如果父類沒有預設構造的方法(無參的構造方法),則需要在初始化列表中呼叫父類的構造方法進行初始化

        • 方法體可省略

      • 命名構造方法

        • 結構[類名+.+方法名]
        • 先使用父類的構造方法進行初始化
        • 是一種特殊的構造方法(針對flutter而言)
        • 方法體可以省略
      • 工廠構造方法

        • factory 標識
        • 唯一例項
        • 更像是其他語言裡邊的單例:大多約定使用static
        • 更像是一種模式
        • 使用工廠模式來定義構造方法就稱為工廠構造方法
      • 命名工廠構造方法

        • 網路請求,資料解析時候會經常用到
        • factory [類名+.+方法名]
        • 可以又返回值,不需要講類的final變數作為引數,是提供一種靈活獲取類物件的方式。
      • 可選引數/預設引數

        • 預設引數一定是可選引數
        • 初始化的時候需要使用 {} 包括起來
        • 非構造方法獨有,其他的方法也可以使用
    • 例項方法

      • 除了構造方法外都是例項方法
    • setters 和 getters

      • 讓外界對內部屬性進行設值/獲取值

        • String get => _school
        • set school(String vlue){_school = value}
    • 靜態方法

      • static myPrintFun(){ print(‘msg is print’) }
      • 類名+方法 進行呼叫

抽象

  • 抽象類

    • abstract 關鍵字修飾
    • 抽象類不能被例項化
    • 定義介面的時候比較常用。類似與虛基類
    • 類可以沒有抽象方法,如果有抽象方法則是抽象類
  • 抽象方法

    • 在抽象類裡邊存在的方法,稱為抽象方法

mixins

  • 必須繼承Ojbect

  • 不能有構造方法

  • 不能呼叫super

  • 特性是可以快速複用程式碼

  • 使用mixins

    • 需要在with關鍵字後邊跟上一個或多個mixins的名字《逗號分割》
    • with要用在extends後邊

泛型

可以提高型別檢測

提高了類、介面、方法的複用性

對不特定資料型別的支援

泛型類、構造方法中也可以使用泛型、泛型方法

非同步

async await

Future

Stream

技巧

善於使用封裝達到儘可能少的程式碼做更多的事情(複用)

繼承(快速的使用其它類已經實現的程式碼)

多型(主要是方法的重用、過載)

點點點技巧

  • 例如:寫了一個類,然後使用.的方式檢視這個類有什麼屬性和方法
  • 通過點選方法進去看看方法具體的實現已經之間的關係
  • 如果之間存在著繼承或者深層巢狀,則積蓄點進去,進行檢視類之間的關係

關於異常的判斷

  • 可以使用?.的形式 避免訪問時候crash

    • 例如List list = List();
    • list.length則會crash
    • list?.length則不會
  • 可以使用?? 提供一個預設值

  • 也可以使用陣列的形式判斷多個條件的匹配

    • 例如:["",null,]

學習資料

http://dart.goodev.org/guides/language/effective-dart

https://dart.dev/guides/language/language-tour

https://dart.dev

函式/方法

方法構成

  • 返回值

  • 引數

    • 普通引數
    • 可選引數
    • 引數預設值

方法型別

  • 入口方法

    • main 方法
  • 構造方法

    • 初始化類變數的方法
  • 例項方法

  • setters/getters

  • 靜態方法

  • 抽象方法

  • 私有方法

  • 匿名方法

  • 泛型方法

心得

Dart的類名字為大寫,但檔名字一般都為小寫(區別於其他的檔案 )

下劃線可以標示私有方法、類、變數

不像是OC,沒有*號的概念,在建立物件的時候

Floating Topic

XMind - Trial Version