Dart 語言極簡入門

1、var 變量、final,const常量編程

  1. 變量var

變量用關鍵詞var來定義,Dart語言是類型推斷的因此在定義變量的時候能夠不用指明變量的類型,例子以下數組

void main() {
      var name = "小明";
      var age = 10;
      var job;

     print(name);
     print(age);
     print(job);
   }
複製代碼

在上面例子中,定義了變量 name 和 age ,job,其中給name賦值 "小明",根據類型推斷name就是String 類型的,給 age賦值 10,根據類型推斷age 就是 int 類型的。對job沒有賦值job變量的默認值就是null。閉包

須要注意的是變量的類型一旦肯定就不能再給他賦不一樣類型的值。異步

  1. 常量final,const

常量用 final 或 const 關鍵字,例子以下async

void main() {
      final a = "好";
      const b = 1;
    }
複製代碼

須要注意的是,常量在定義的時候必定要進行賦值,且定義好之後不能被修改不然會報錯。編程語言

2、Dart中的數據類型ide

在Dart中all is Object ,Dart 中有 numbers(數值類型),strings (字符串類型),booleans(布爾類型),lists(列表類型),maps(字典類型),runes(字符類型),symbols(符號類型)異步編程

  1. 數值類型

在Dart中數值類型只有int 和 double兩種,例子以下函數

void main() {
        int a = 1;
        double b = 2;

        print(a);
        print(b);
   }
複製代碼

上面的例子中定義了整數類型的a,和double 類型的 b,打印結果是this

flutter: 1

flutter: 2.0

2.String字符串類型

Dart中字符串用單引號 '' 或雙引號 "" 來建立,例子以下:

void main() {
    var a = "熱愛編程";
    var b = '哈哈哈哈';
    print(a);
    print(b);
  }
  
  //輸出結果:
  //flutter: 熱愛編程
  //flutter: 哈哈哈哈
複製代碼

字符串的格式化

在Dart 中用 ${} 來進行字符串的格式化,例子以下:

void main() {
    var a = "熱愛編程";
    var b = '哈哈哈哈';
    var c =  "咱們都  ${a + b} ";
    print(c);
 }

//輸出結果爲
//flutter: 咱們都  熱愛編程哈哈哈哈
複製代碼

上面的例子中字符串 a 和 b 能夠用 + 號 直接拼接在一塊兒

在字符串中能夠用反斜槓\來進行字符轉譯

字符串的相關方法使用例子以下:

void main() {
    var a = "熱愛編程";
    //判斷是否爲空
    print(a.isEmpty);
    //字符串的長度
    print(a.length);
    //字符串的類型
    print(a.runtimeType);
  }

 //輸出結果爲:
 //flutter: false
 //flutter: 4
 //flutter: String
複製代碼

上面例子是字符串的經常使用方法,isEmpty是判斷字符串是否爲空,length是求字符串的長度,runtimeType是求字符串的類型。

字符串也是一種集合類型,例子以下:

void main() {
    var a = "熱愛編程";
    print(a[1]);
  }
  //輸出爲:
  //flutter: 愛
複製代碼
  1. bool布爾類型

Dart中的布爾類型只有 true和false,例子以下:

void main() {
    var a = false;
    print(a.runtimeType);
 }
 //輸出結果:
 //flutter: bool
複製代碼

4.List列表類型(數組類型)

用List來定義列表,能夠在<>內指定列表元素的數據類型,例子以下:

void main() {
    List<int> a = [10,100,1000];
    List<String> b = ["熱", "愛","編","程"];
  }
複製代碼

上面例子中,尖括號中的類型用來指定元素的數據類型,若是列表指定了元素的數據類型,就只能存放該種數據類型的數據。若是想在列表中存放不一樣類型的數據,能夠將列表中元素的類型用dynamic關鍵字聲明爲動態類型的,例子以下:

void main() {
    List<dynamic> a = [10,"哈哈哈",99.9];
  }
複製代碼

可是在通常開發中咱們不須要指定列表的元素類型,由於Dart是能夠類型推斷的,因此直接使用var進行聲明便可,上面的例子通常以下聲明:

void main() {
    var a = [10,"哈哈哈",99.9];
  }
複製代碼

列表中的經常使用方法的使用例子以下:

void main() {
    var a = [10,"哈哈哈",99.9];
    //添加元素
    a.add("ccc");
    //刪除一個元素
    a.remove(10);
    //元素個數
    a.length;
    //...等等其餘方法
  }
複製代碼
  1. Map字典類型

字典定義使用例子以下:

void main() {
    Map<String, dynamic> a = {"name": "Flutter" , "languge": "Datr"};
  }
複製代碼

用Map來定義一個字典,在尖括號內來指定字典的key和value的數據類型,須要主要的是和數組同樣,一旦類型被肯定,那麼就必需要和定義的類型一致不然會報錯。

由於 Dart是能夠類型推斷的,因此上面的例子能夠直接用var來定義以下:

void main() {
  var a = {"name": "Flutter" , "languge": "Datr"};
  print(a);
}
//輸出爲:
//flutter: {name: Flutter, languge: Datr}
複製代碼

Map能夠經過鍵來獲取,設置,新增值,例子以下:

void main() {
  var a = {"name": "Flutter" , "languge": "Datr"};
  //新增鍵值對
  a["version"] = "1.1.0";
  //修改鍵值
  a["name"] = "Swift";
  print(a);
}
//輸出結果:
//flutter: {name: Swift, languge: Datr, version: 1.1.0}
複製代碼

3、Dart中的運算符

1.算數運算符加"+",減 "-" ,乘"*" ,除"/",取整 "~/",取模%

"+"是用來作加的運算,除了數字類型外,字符串,列表,字典也支持相加運算,例子以下:

void main() {

      var a = 10 + 20;
      var b = "10"  + "10";
      print(a);
      print(b);

   }

   //打印結果:
   //flutter: 30
   //flutter: 1010
複製代碼

"~/" 是取整的運算符,例子以下:

void main() {
      var a = 15;
      var b =  a ~/ 4;
      print(b);
    }
    //打印結果:
    //flutter: 3
複製代碼

再其餘運算符與其餘編程語言基本同樣不作介紹

  1. 比較運算符 == ,!= ,> , < , >= ,<=

與其餘語言基本同樣不作介紹

3.類型運算符 as,is, is!

as是作類型的轉換

is是判斷是否屬於某個類型

is!是判斷是否不屬於某個類型

  1. ??

「??」 是Dart的空條件運算符,就是取默認值的意思,例子以下

void main() {
        var a;
        var b = a ?? 1;
        print(b);
    }
    //輸出結果:
    //flutter: 1
複製代碼

上面的例子中, 變量a沒有賦值因此默認爲null,在將a賦值給b的時候由於a是null,因此 經過?? 給把1賦值給了a。

5.級聯運算符 「..」

級聯運算符能夠對某個對象進行連續的操做而不用生成中間變量,例子以下: 例子一

class Person{

    func_one(){
      print("Dart語言");
    }

     func_two(){
      print("Flutter使用Dart");
     }
  }

  void main() {
    Person()..func_one()..func_two();
  }
  //打印結果以下:
  //flutter: Dart語言
  //flutter: Flutter使用Dart
複製代碼
  1. 點運算符以及「?.」的使用

點運算符用來訪問對象的屬性或方法,對不肯定是否爲null的對象能夠用「?.」來進行操做,例子以下:

class Person{
    var name;

  }

  void main() {
    var p = Person();
    print(p?.name);
  }
複製代碼

4、 函數

1.函數的通常書寫格式:

返回值  函數名稱(參數列表){
    函數體
}
複製代碼

例子以下:

void main() {

    int func_add(int a,int b){
      return a + b;
    }

    var c = func_add(1, 2);
    print(c);
  }
  //打印結果:
  //flutter: 3
複製代碼

上面例子中main函數是程序的入口, 裏面定義了func_add函數

Dart中的all is對象, 因此能夠將函數賦值給一個變量或者將函數做爲參數,例子以下;

void main() {

    int func_add(int a,int b){
      return a + b;
    }

    var c = func_add;
    var d = c(1,2);
    print(d);
 }
複製代碼

Dart語言中在定義函數的時候函數的參數類型和返回值類型均可以省略,Dart語言會根據傳入的參數和返回的值來動態推斷。例子以下:

void main() {

    func_add(a,b){
      return a + b;
    }

    var c =  func_add(1, 2);
    print(c);
}
//打印結果
//flutter: 3
複製代碼

若是某個函數的函數體只有一句話能夠用箭頭函數來定義,例子以下:

void main() {

    func_add(a,b) => a + b;

    var c =  func_add(1, 2);
    print(c);
  }
  //輸出結果:
  //flutter: 3
複製代碼

2.可選參數的函數定義

名稱可選參數函數的通常格式爲

返回值類型 函數名稱({可選參數列表}){
      函數體
  }
複製代碼

可選參數放在{}號內部,例子以下:

void main() {

    func_text({a,b}) {

      if(a != null){
          print(a);
      }

      if(b != null){
         print(b);
      }

     };

     func_text(a: 2);
 }
 //打印結果
 //flutter: 2
 
 上面的例子中定義了函數func_text其中參數 a和b都是可選的,須要注意的是,在調用的時候須要參數名稱加:的形式來進行傳參數
複製代碼

位置可選參數,只須要將可選參數放入中括號便可,例子以下;

void main() {

    func_text(a, [b]) {

      if(a != null){
        print(a);
      }

      if(b != null){
       print(b);
      }

    };

    func_text(2,3);

  }
  //輸出結果
  //flutter: 2
  //flutter: 3
複製代碼

在上面例子中func_text中有兩個參數a和b,其中b 是可選的。在調用的時候能夠不傳。

函數可選的能夠給個默認值,若是沒有默認值函數中取到的參數值爲null,,設置默認值之後若是調用的時候沒有傳入這個參數,在函數內就會使用默認值,在定義可選參數的時候應該儘可能提供一個默認值。

例子以下:

void main() {

      func_text(a, [b = 4]) {

       if(a != null){
          print(a);
        }

        if(b != null){
           print(b);
        }

       };

      func_text(3);
  }
  
  //打印以下:
  //flutter: 3
  //flutter: 4
複製代碼

三、匿名函數

Dart中沒有名稱的函數是匿名函數,匿名函數能夠直接賦值給變量,經過變量來調用。例子以下:

void main() {

    var a = (b,c){
      return b + c;
    };

    var d = a(1,2);
    print(d);
  }
  //打印以下:
  //flutter: 3
複製代碼

在上面的例子中,把匿名函數賦值給了變量a,而後經過a來調用。

5、閉包

閉包是一種特殊的函數。

閉包是定義在函數內部的函數。

閉包可以訪問外部方法內的局部變量並持有。

經典例子以下:

void main() {

    var  func = a();
    func();
    func();
    func();
  }

  a(){
    int count = 0;

    func_count(){
       print(count ++);
    }
    return func_count;
 }
 //打印結果:
 //flutter: 0
 //flutter: 1
 //flutter: 2
複製代碼

上面例子中, 函數a中的 func_count函數就是閉包,他定義在a函數內,可以訪問並持有他外部函數的局部變量count,暫時理解到這裏後面會詳細說明閉包的使用。

6、類

Dart是基於類和繼承的面向對象的語言。對象是類的實例。在類中定義了對象的屬性和方法。

  1. 自定義類和類的構造函數

Dart中用 class關鍵字來進行類的定義,例子以下:

class Person {
    
    double weight;
    int age;
}
複製代碼

上面的例子中定義了Person類,類中定義了兩個屬性weight和age;咱們能夠經過Person來建立對象,經過類來建立對象須要調用類的構造函數。類的構造函數通常和類的名字同樣。當定義一個類時Dart會默認生成一個沒有參數的構造函數,能夠直接經過類的名稱來調用。例子以下:

class Person{
          var name;

     }

  void main() {
    var p = Person();
    print(p?.name);
  }
複製代碼

上面的例子中,定義的Person類能夠直接經過Person()來建立對象。類對象中的方法屬性均可以經過點來訪問調用。

通常Dart語言的構造方法的書寫格式以下:

class Person{
          var name;
          var age;
          
          //通常構造方法的書寫格式
          Person(this.name,this.age);

     }
複製代碼

2.類的實例方法:

類定義了屬性和方法,通常屬性用來存儲數據,方法用來定義行爲。

例子以下:

class Person{
          var name;
          var age;
          
          //通常構造方法的書寫格式
          Person(this.name,this.age);
          
          func_run(){
             print("在跑步");
          }
}
複製代碼

上面的例子中定義了方法func_run()就是Person類中的方法。調用的例子以下:

void main() {
    var p = Person();
    p.func_run();
}
複製代碼

在類中用this來訪問自身的屬性和方法,例子以下:

class Person{
          var name;
          var age;
          
          //通常構造方法的書寫格式
          Person(this.name,this.age);
          
          func_run(){
             print(" ${this.name}  在跑步"); //用this訪問name屬性
          }
}
複製代碼

類中還有兩個比較特殊的方法,Setters 和 Getters方法,Setters用來設置對象的屬性,Getters用來獲取對象的屬性。在定義屬性時Dart會默認生成Setters和Getters方法。

  1. 抽象類和抽象方法

Dart中 在抽象類中能夠定義抽象方法,抽象方法是隻有定義沒有函數實現的方法。抽象方法是面向接口開發的基礎。

抽象類用abstract關鍵字來定義。例子以下:

abstract class PersonInterface{
         func_run();
   }
複製代碼

上面例子中定義了一個PersonInterface 的接口,裏面只定義了一個func_run()的抽象方法。Person類能夠對這個接口進行實現例子以下:

abstract class PersonInterface{
         func_run();

 }
 
 class Person implements PersonInterface{
          var name;
          var age;
          
          //通常構造方法的書寫格式
          Person(this.name,this.age);
          
          實現接口函數
          func_run(){
             print(" ${this.name}  在跑步"); //用this訪問name屬性
          }
}
複製代碼

一個類也能夠同時實現多個接口。

抽象類不能夠被實例化。

  1. 類的繼承

子類繼承父類,就可使用父類中的屬性和方法。而且子類能夠重寫夫類中的屬性和方法。Dart中用extends關鍵字來進行類的繼承。例子以下:

class Person{
          var name;
          var age;
          //通常構造方法的書寫格式
          Person(this.name,this.age);
          
          func_run(){
             print("在跑步");
          }
}

class Man extends  Person{
    
    //構造函數調用夫類的構造函數
    Man(name,age) : super(name,age);
    
    func_eat(){
        print("正在吃飯");
    }
    
}
複製代碼

上面的例子中Man類繼繼承了Person類,須要注意的是構造函數不能被繼承,但能夠經過super來調用夫類的方法。子類也能夠重載父類的方法。例子以下:

class Person{
          var name;
          var age;
          //通常構造方法的書寫格式
          Person(this.name,this.age);
          
          func_run(){
             print("在跑步");
          }
}

class Man extends  Person{
    
    //構造函數調用夫類的構造函數
    Man(name,age) : super(name,age);
    
    func_eat(){
        print("正在吃飯");
    }
    
    @override
    func_run(){
        print("Man在跑步");
    }

}
複製代碼

上面例子中子類重載父親類的func_run()方法,其中@override關鍵字用來標註這個方法是子類重載夫類的,@override關鍵字能夠省略。

  1. 枚舉

枚舉用enum來定義。例子以下:

enum  Language{
      Dart,
      Oc,
      Swift
  }


  class Person{
          var name;
          Language language;
          
          //通常構造方法的書寫格式
          Person(this.name,this.language);

 }
    
    
    void main() {
         var p = Person();
         p.language = Language.Dart;
         print(p.language);
   } 
   
   //輸出:
   //Dart
複製代碼

七、 類的Mixin特性

Mixin是Dart中很是強大的一個功能。Dart語言是但繼承的只能繼承一個父類。不少時候須要集合多個類的功能來實現一個複雜的自定義類,這時候Mixin特性就會用到。

Mixin的功能就是讓一個類把其餘類的功能混合進來。例子以下:

能被用來混合的類是Mixin類,Mixin類不能實現構造方法不然不能被其餘類混合,用with關鍵字來進行混合。Mixin也支持多混合。

  1. 範型

例子以下:

class Person{
          T data;  
          //通常構造方法的書寫格式
          Person(this.data);
 }
複製代碼

** 7、異步編程 async , await , Future的使用**

8、模塊的引用

用 import來倒入模塊

例子:

import "./lib/aa.dart";

重名的話能夠用as來從新定義名稱以下

import "./lib/aa.dart" as bb;

使用:
 void main() {
         aa();
         bb.aa();
  } 
複製代碼

未完待續

相關文章
相關標籤/搜索