1、var 變量、final,const常量編程
變量用關鍵詞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。閉包
須要注意的是變量的類型一旦肯定就不能再給他賦不一樣類型的值。異步
常量用 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(符號類型)異步編程
在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: 愛
複製代碼
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;
//...等等其餘方法
}
複製代碼
字典定義使用例子以下:
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
複製代碼
再其餘運算符與其餘編程語言基本同樣不作介紹
與其餘語言基本同樣不作介紹
3.類型運算符 as,is, is!
as是作類型的轉換
is是判斷是否屬於某個類型
is!是判斷是否不屬於某個類型
「??」 是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
複製代碼
點運算符用來訪問對象的屬性或方法,對不肯定是否爲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是基於類和繼承的面向對象的語言。對象是類的實例。在類中定義了對象的屬性和方法。
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方法。
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屬性
}
}
複製代碼
一個類也能夠同時實現多個接口。
抽象類不能夠被實例化。
子類繼承父類,就可使用父類中的屬性和方法。而且子類能夠重寫夫類中的屬性和方法。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關鍵字能夠省略。
枚舉用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也支持多混合。
例子以下:
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();
}
複製代碼
未完待續