Flutter 學習小記

學習自視頻 [千鋒]2020全新Dart Flutter開發(fā)教程

  1. var 聲明變量,如果初始化時不指定類型(即只聲明不賦值)蹬屹,則其是動態(tài)類型 dynamic柏蘑,可以給其賦值任意類型的值狂窑。如果指定了類型,則其類型就確定了染厅,后續(xù)不能更改痘绎。

    var a; // 初始化沒有指定類型,a 為動態(tài)類型(相當于:dynamic a;)
    a = 2; // ?
    a = 'hello'; // ?
    
    var b = 1; // 初始化就確定了值的類型肖粮,b的類型不能再更改(相當于:int b = 1;)
    b = 'hello'; // ?
    
  2. final 修飾的變量在聲明時必須初始化孤页,且不能被再次賦值。

    void main() {
      int a; // ?
      final a = 1; ?
      final a; // ?
    }
    
  3. const 聲明的必須是 編譯器常量涩馆。

    int getNum() { return 1; }
    
    void main() {
      final a = getNum(); // ?
      const b = getNum(); // ?
    }
    
  4. intdouble 都是 num 類型的子類

    int a = 1;
    a = 1.1; // ? (不能把 double 類型賦值給 int 類型)
    
    num c = 3; // 用 num 類型聲明 c行施,c 既可以是 int 類型允坚,也可以是 double 類型
    c = 3.3 // ?
    
  5. 通過提供一個 r 前綴,可以創(chuàng)建一個 原始raw 字符串

    var s = r"In a raw string, even \n isn't special.";
    print(s); // 不會產(chǎn)生換行效果蛾号,打印結(jié)果為:In a raw string, even \n isn't special.
    
  6. 如果一個對象等于 null稠项,調(diào)用它的方法,運行時會報錯

    List a;
    
    a.add(1); // ? Unhandled Exception: NoSuchMethodError: The method 'add' was called on null.
    
    a?.add(1); // ? 由于 ? 判斷出 a 等于 null鲜结,便直接忽略掉后續(xù)操作:add()
    
  7. const 定義一個不可變的 List展运,如果執(zhí)行修改操作,運行時會報錯

    List a = const [1, 2];
    a.add(3); // ? Unhandled Exception: Unsupported operation: Cannot add to an unmodifiable list
    
  8. as精刷、is拗胜、is! 操作符在運行時用于檢查類型非常方便

    as:類型轉(zhuǎn)換
    is:當對象是相應(yīng)類型時返回 true
    is!:當對象不是相應(yīng)類型時返回 true
    
  9. 賦值操作符 ??= ,僅當變量為 null 時賦值

    var a = 1;
    a ??= 2; // 
    print(a) // 輸出 1
      
    var b;
    b ??= 2;
    print(b) // 輸出 2
    
  10. 級聯(lián)符號 ..

querySelector('#confirm') // 獲取一個對象
  ..text = 'Confirm' // 使用它的成員
  ..classes.add('important')
  ..onClick.listen((e) => window.alert('confirmed!'));

上述代碼相當于:

var button = querySelector('#confirm');
button.text = 'Confirm';
button.classes.add('important');
button.onClick.listen((e) => window.alert('confirmed'));

可以看出贬养,遵循級聯(lián)符號的代碼都是對第一個方法返回的 button 對象進行操作挤土,而忽略任何可能返回的后續(xù)值。

級聯(lián)操作符可以嵌套

final addressBook = (AddressBookBuilder()
      ..name = 'jenny'
      ..email = 'jenny@example.com'
      ..phone = (PhoneNumberBuilder()
            ..number = '415-555-0100'
            ..label = 'home')
          .build())
    .build();

注意

var a = StringBuffer();
a.write('foo') // 這兒是用的'.'误算,而非級聯(lián)運算符'..'
 ..write('bar'); // ? 第一個 a.write() 返回值是 void,返回值為 void 的方法則不能使用級聯(lián)運算符


var b = StringBuffer();
b
  ..write('foo')
  ..write('bar'); // ?
  1. 使用 dynamic 方式定義方法

    getUser(name) => '$name is very good!'; // 參數(shù)和返回值類型都是 dynamic 的
    
    print(getUser('zhangsan'));
    
  2. 方法的參數(shù):

    1. 必要參數(shù)迷殿;

      getProduct(num id, String description) {};
      
      getProduct(1, 'description'); // ?
      getProduct(id: 1, description: 'description'); // ? 調(diào)用時 不能寫參數(shù)名
      
    2. 可選參數(shù):

      1. 命名參數(shù)儿礼,表達形式:{k: v} 鍵值對;

        getProduct({bool flag, String name}) {};
        
        getProduct(); // ?
        getProduct(flag: true); // ?
        getProduct(name: 'zhangsan'); // ?
        getProduct(flag: true, name: 'zhangsan'); // ?
        
      2. 位置參數(shù)庆寺,表達形式:[type name]

        getProduct([bool flag, String name]) {};
        
        getProduct(true); // ?
        getProduct(true, 'zhangsan'); // ?
        getProduct(null, 'zhangsan'); // ?
        getProduct('zhangsan'); // ? 必須傳前面的 flag 參數(shù)蚊夫,否則會提示 String和bool 類型不匹配
        getProduct(flag: true, name: 'zhangsan'); // ? 調(diào)用時 不能寫參數(shù)名
        

    注意:不能同時使用可選的位置參數(shù)和可選的命名參數(shù)。必要參數(shù)定義在參數(shù)列表前面懦尝,可選參數(shù)則定義在必要參數(shù)后面知纷。

  3. Dart 中的構(gòu)造方法是不支持重載的,可以通過 命名的構(gòu)造方法 來實現(xiàn)構(gòu)造方法的重載:

    class Student {
      String name;
      final int gender;
    
      Student(this.name, this.gender);
    
      // 命名的構(gòu)造方法
      Student.withName(this.gender) {}
    }
    

    注意:用 final 修飾的屬性 gender陵霉,不能用如下寫法來初始化:

    Student(String name, int gender) {
      this.name = name;
      this.gender = gender; // ? 'gender' can't be used as a setter because it is final.
    }
    
  4. 常量構(gòu)造方法琅轧,需要把該類的構(gòu)造方法用 const 修飾,并且該類的所有實例屬性必須是 final

    class Student {
      final String name;
      final int age;
    
      // 常量構(gòu)造方法 const
      const Student(this.name, this.age);
    }
    
    const s = Student('zhangsan', 18);
    
  5. getter 方法

    class Student {
      int _age;
      
      int get age => _age; // 或 int get age { return _age; }
    }
    
  6. setter 方法

    class Student {
      int _age;
      
      set age(int age) => _age = age; // 或 set age(int age) { _age = age; }
    }
    
  7. factory 工廠構(gòu)造函數(shù):使用 factory 關(guān)鍵字標識的構(gòu)造函數(shù)踊挠,意味著使用該構(gòu)造函數(shù) 構(gòu)造類的實例時乍桂,并非總是會返回新的實例對象。例如效床,工廠構(gòu)造函數(shù)可能會從緩存中返回一個實例睹酌,或者返回一個子類型的實例。

    class Person {
      static final Map<String, Person> _cache = {};
    
      // 工廠構(gòu)造方法
      factory Person() {
        return _cache.putIfAbsent('p', () => Person._inner());
      }
    
      // 命名的私有構(gòu)造方法
      Person._inner();
    }
    
    var a = Person(); // 緩存中沒有剩檀,a 是新建的實例憋沿,并存入 緩存 _cache 中
    var b = Person(); // 緩存中有了,b 是從緩存 _cache 中讀取的實例
    print(a == b); // 輸出 true
    
  8. 如果類實現(xiàn)了 call 方法沪猴,則該類的對象可以作為方法使用

    class Student {
      call(int x, int y) { // 可以不加參數(shù)
        print(x + y);
      }
    }
    
    var a = Student();
    a(1, 2); // 輸出 3
    
  9. abstract 抽象類中的抽象方法辐啄,子類必須重寫

    abstract class Person {
      say() {} // 普通方法或?qū)傩?
      sleep(); // 抽象方法
    }
    
    class Student extends Person {
      @override
      sleep() {
        // TODO: implement sleep
        return null;
      }
    }
    

    抽象類常用于聲明接口方法采章,通常不能被實例化,但有時也會有具體的方法實現(xiàn)则披。如果想讓抽象類同時可被實例化共缕,可以為其定義 工廠構(gòu)造函數(shù)

  10. Dart 是單繼承士复,但一個類可以 實現(xiàn)implements 多個接口图谷。

    class Point implements Comparable, Location {...}
    
  11. import 時使用 as 可以為模塊中的代碼重命名(可以避免不同模塊中的同名代碼沖突),白可以使用 showhide 關(guān)鍵字來 指定 暴露或隱藏 模塊中的部分代碼阱洪。

    import './one.dart' as lib1;
    import './two.dart' as lib2 show method2; // lib2 中僅 method2 方法可見
    import './three.dart' as lib3 hide method3, mehtod33; // lib3 中的 method3 和 method33 方法不可見
    
  12. Container 中嵌套 Container便贵,如果不設(shè)置 外層 Containeralignment,則內(nèi)層的 Container 會填滿外層的 Container冗荸,內(nèi)層 Container 設(shè)置的寬高會被忽略承璃。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市蚌本,隨后出現(xiàn)的幾起案子盔粹,更是在濱河造成了極大的恐慌,老刑警劉巖程癌,帶你破解...
    沈念sama閱讀 218,941評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件舷嗡,死亡現(xiàn)場離奇詭異,居然都是意外死亡嵌莉,警方通過查閱死者的電腦和手機进萄,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,397評論 3 395
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來锐峭,“玉大人中鼠,你說我怎么就攤上這事⊙伛” “怎么了援雇?”我有些...
    開封第一講書人閱讀 165,345評論 0 356
  • 文/不壞的土叔 我叫張陵,是天一觀的道長抛寝。 經(jīng)常有香客問我熊杨,道長,這世上最難降的妖魔是什么盗舰? 我笑而不...
    開封第一講書人閱讀 58,851評論 1 295
  • 正文 為了忘掉前任晶府,我火速辦了婚禮,結(jié)果婚禮上钻趋,老公的妹妹穿的比我還像新娘川陆。我一直安慰自己,他們只是感情好蛮位,可當我...
    茶點故事閱讀 67,868評論 6 392
  • 文/花漫 我一把揭開白布较沪。 她就那樣靜靜地躺著鳞绕,像睡著了一般。 火紅的嫁衣襯著肌膚如雪尸曼。 梳的紋絲不亂的頭發(fā)上们何,一...
    開封第一講書人閱讀 51,688評論 1 305
  • 那天,我揣著相機與錄音控轿,去河邊找鬼冤竹。 笑死,一個胖子當著我的面吹牛茬射,可吹牛的內(nèi)容都是我干的鹦蠕。 我是一名探鬼主播,決...
    沈念sama閱讀 40,414評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼在抛,長吁一口氣:“原來是場噩夢啊……” “哼钟病!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起刚梭,我...
    開封第一講書人閱讀 39,319評論 0 276
  • 序言:老撾萬榮一對情侶失蹤肠阱,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后朴读,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體辖所,經(jīng)...
    沈念sama閱讀 45,775評論 1 315
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,945評論 3 336
  • 正文 我和宋清朗相戀三年磨德,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片吆视。...
    茶點故事閱讀 40,096評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡典挑,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出啦吧,到底是詐尸還是另有隱情您觉,我是刑警寧澤,帶...
    沈念sama閱讀 35,789評論 5 346
  • 正文 年R本政府宣布授滓,位于F島的核電站琳水,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏般堆。R本人自食惡果不足惜在孝,卻給世界環(huán)境...
    茶點故事閱讀 41,437評論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望淮摔。 院中可真熱鬧私沮,春花似錦、人聲如沸和橙。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,993評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至晰搀,卻和暖如春五辽,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背外恕。 一陣腳步聲響...
    開封第一講書人閱讀 33,107評論 1 271
  • 我被黑心中介騙來泰國打工杆逗, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人吁讨。 一個月前我還...
    沈念sama閱讀 48,308評論 3 372
  • 正文 我出身青樓髓迎,卻偏偏與公主長得像,于是被迫代替她去往敵國和親建丧。 傳聞我的和親對象是個殘疾皇子排龄,可洞房花燭夜當晚...
    茶點故事閱讀 45,037評論 2 355

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