目錄
- 內(nèi)建類型
- 變量
- 訪問屬性
- 常量
- 函數(shù)
- 單繼承棠赛,接口實現(xiàn)深碱,混入
- Future
內(nèi)建類型
- Number--包含了int 和 double
- String
- Boolean
- List (也被稱為 Array)
- Map
- Set
- Rune (用于在字符串中表示 Unicode 字符)
- Symbol
變量
1两波、使用var關(guān)鍵字聲明變量
var a = "1111";
print(a.runtimeType)//打印類型
a = 1111;//將num類型賦值給a,編譯不通過
輸出
String
2搭伤、指定類型聲明變量弄唧,即顯式聲明
String a = "1111";
a = 1111;//將num類型賦值給a,編譯不通過
3苗膝、使用任何類的基類Object聲明變量殃恒,包括Null 和 Founction
Object d = "11111";
print(d.runtimeType);
d = 1111;//更改變量 d 的類型
print(d.runtimeType);
輸出
String
int
4植旧、使用 dynamic 聲明變量
dynamic a = "1111";
print(a.runtimeType);
a = 1111;
print(a.runtimeType);
輸出
String
int
=> var 聲明變量時一旦賦值辱揭,類型將無法改變
Q:Object和dynamic的區(qū)別是什么?
A:dynamic的類型是在變的病附,Object就是一個Object類型问窃,比如:
Object a = 1;
a = a + 2;//無法通過編譯
dynamic a = 1;
a = a + 2;//編譯通過,
看下面特殊情形
var a; //聲明變量a,但是并未賦值
print(a.runtimeType);
a = 111;
print(a.runtimeType);
a = "111"; //這行代碼為什么能夠編譯通過呢完沪?
print(a.runtimeType);
輸出
Null
int
String
這里為什么a="111"不會報錯呢域庇?
=>A:這里用var 聲明變量a嵌戈,沒有進行賦值操作,不能確定a的類型听皿,所以編譯器認為他是動態(tài)的dynamic
訪問屬性
公開的和私有的熟呛,前面下劃線表示私有的
var _name = "xiaobao";//私有的
var age = 18;//公開
常量
使用過程中從來不會被修改的變量
void main() {
const a = 1111;
a = 222; //無法編譯通過
final b = 1111;
b = 2222; //無法編譯通過
const aa1 = AA(); //無法編譯通過
final aa2 = AA();
}
//自定義類
class AA {}
=>
final 只能被設(shè)置一次
const 在編譯時已經(jīng)確定值
一般使用場景是:
const可以用于定義編譯之前就已經(jīng)確定的值,比如PI=3.141592654
final可以用于需要運行代碼之后才賦值的操作
函數(shù)
構(gòu)造函數(shù)的寫法
class Animal {
String name;
int age;
//寫法1
Animal(name, age) {
this.name = name;
this.age = age;
}
}
class Animal {
String name;
int age;
//寫法2
Animal(this.name, this.age);
}
//這里的this.name 相當于在函數(shù)體中進行賦值操作尉姨,這個也適用于一般的函數(shù)
//注意庵朝,寫法1和寫法2 構(gòu)造函數(shù)只能存在一種,無法同時聲明兩個
class Animal {
String name;
int age;
//寫法3
Animal.noAge(this.name);
Animal.noName(int age){
this.age=age;
}
}
//通過 類名.函數(shù)名 來進行聲明構(gòu)造函數(shù)又厉,可以聲明多個構(gòu)造函數(shù)
非構(gòu)造函數(shù)
函數(shù)可以作為參數(shù)傳遞給其他函數(shù)九府,函數(shù)可以賦值給變量
void main() {
var func = getAge;
print(func.runtimeType);
print(func.call());
}
int getAge() {
return 11;
}
輸出
() => int
11
函數(shù)的參數(shù)
可選命名參數(shù)---Flutter中的Widgets大多數(shù)都是可選參數(shù)
//可選參數(shù)定義,大括號括起來,可選參數(shù)和位置無關(guān)
setPlay(String withWho,{int playHour, String gameName}) {
//...
}
//可選參數(shù)的使用--可選參數(shù)必須帶上參數(shù)名覆致,比如這里的playHour或者gameName
setPlay("小花",playHour:2,gameName:"躲貓貓");
setPlay("小花",gameName:"躲貓貓",playHour:2);//這里的gameName和playHour位置可以互換
setPlay("小花",gameName:"躲貓貓");
setPlay("小花");
必傳參數(shù)
//必傳參數(shù)是基于可選參數(shù)做的限制 用 @required 修飾參數(shù)
setPlay(String withWho,{int playHour, @required String gameName}) {
}
setPlay("小花",playHour:2,gameName:"躲貓貓");
setPlay("小花",gameName:"躲貓貓");
setPlay("小花");//這行代碼無法編譯通過侄旬,因為gameName是必傳的參數(shù)
=>一般對于參數(shù)較多的情況,都會用可選參數(shù)大括號進行包裹煌妈,然后再對必傳的參數(shù)加@required修飾儡羔,提高可讀性
可選位置參數(shù)-->將參數(shù)放到 []
中來標記參數(shù)是可選的:
//聲明
void play(String name, [String address, int age]) {
}
//使用
play("小花","杭州",12);
play("小花","杭州");
play("小花",12);//無法編譯不通過
=>位置參數(shù)[ ],按照位置璧诵,前面的一個參數(shù)必須設(shè)置了值笔链,不能指定參數(shù)名
函數(shù)擴展extension
extension String2Number on String {
int toInt() {
return int.parse("111");
}
}
//使用
"111".toInt();
繼承-extends,接口實現(xiàn)-implements腮猖,混入-mixin
如果同時使用了繼承鉴扫,混入和接口實現(xiàn),并且方法一致澈缺,優(yōu)先級
self>mixin>extends>implement
Future 類似于前端的Promise
getUserInfo().then((value)=>{
//成功
}).catchError((error)=>{
//失敗
}).whenComplete(()=>{
//結(jié)束
})
Future<String> getUserInfo() async{
return "aaaa";
}