一. Dart入口方法
每一個flutter項目的lib目錄里面都有一個main.dart他匪。這個文件就是flutter的入口文件菇存,其中的main方法是dart的入口方法。
runApp返回的是組件邦蜜。MyApp是自定義的一個組件依鸥。在flutter里面萬物皆組件。
# void是當前函數(shù)的返回值 可以省略
void main() {//程序執(zhí)行的入口函數(shù) 有且僅有一個 必須的
runApp(MyApp)
print('Hello World!')//dart通過print方法打印數(shù)據(jù)
}
//如果runApp后面只有一行代碼也可以這樣寫
void main() => runApp(MyApp());
二. Dart變量,常量和命名規(guī)則
- 變量
dart是一個強大的腳本類語言悼沈,可以不預(yù)先定義變量類型贱迟,dart會通過類型推斷 type inference(swift也是)自動判斷當前變量的類型。dart中定義變量是通過var關(guān)鍵字或者通過類型來聲明變量絮供。
var str = '這是var變量';
String str1 = '這是類型聲明的變量';
int number = 123;
注意: var 后不要寫類型衣吠,寫了類型不要寫var 寫了會報錯 var a int = 5
-
常量
常量通過
final
或者const
修飾。差異之處:
const
修飾的常量在創(chuàng)建時就需要賦值(編譯時的常量)賦值后不可改變壤靶。final
不僅有const
的編譯時的常量特性缚俏,最重要的是它的運行時常量。并且final
是惰性初始化贮乳,即在運行時第一次使用前才初始化袍榆。如果是不改量的量,請使用final
或者cont
修飾它塘揣,而不是使用var
或者其他變量類型。
final name = ‘huang’;
final String rename = 'hai';
const bar = 100000;
cont double atm = 1.01325 * bar
- dart的命名規(guī)則
- 變量等名稱必須由數(shù)字宿崭、字母亲铡、下劃線和美元符號($)組成。
- 注意:標識符開頭不能是數(shù)字葡兑。
- 標識符不能使保留字或者關(guān)鍵字奖蔓。
- 變量的名稱是區(qū)分大小寫的如:age和Age是不同的變量。在實際的運用中讹堤,也建議不要用一個
- 標識符(變量名稱)一定要見名思意 :變量名稱建議用名稱吆鹤,方法名稱建議用動詞
三. Dart基礎(chǔ)數(shù)據(jù)類型
-
字符串(String)
① 字符串創(chuàng)建方式
通過var
關(guān)鍵字或者String
單引號、雙引號洲守、三個單引號或者三個雙引號來包裹字符組成字符串變量或者常量疑务。
②字符串拼接沾凄,通過+
號或者通過$加變量 $str或者${表達式}
。
對應(yīng)的①
/單引號 '' 或者 雙引號 "" 來包裹字符組成字符串
String str1 = '這是字符串';
String str2 = "這是字符串";
//使用 + 鏈接兩個字符串
String str3 = str1 + str2;
print(str3);
//多行字符串使用三重單引號 '''字符串'''
//三重雙引號 """字符串"""
String str4 = """ 1111
22222
333333""";
print(str4);
//使用r前綴 可以使字符串里面的特殊字符作為普通字符串
// \n 換行符 特殊字符
String str5 = r'這是特殊字符\n現(xiàn)在不會換行';
String str6 = '這是特殊字符\n現(xiàn)在會換行';
print(str5);
print(str6);
對應(yīng)的②
var str4 = str + str1;
print('$str4 ${str4.length}');
// dart判斷數(shù)據(jù)類型 is關(guān)鍵詞用來判斷數(shù)據(jù)類型
if(str4 is String){
// print()
}
-
num(數(shù)字)
num
是數(shù)字類型的父類知允,有兩個子類int
和double
撒蟀。- int 整型 數(shù)值范圍在-2的53次方到2的53次方減1
- double雙精度浮點型
- int 必須是整型 double 既可以接收整型也可以接收浮點型
//print函數(shù)是控制套輸出函數(shù)
print('a 是 $a');
print('你好dart');
double c = 10;//double可以包含整型 整型 dart sdk 2.1 之前不能使用,會報錯
double d = 10.1;
print('d = $d');
num aa = -3; //num 是number類型的簡寫 abs()取絕對值
print('asdasdas' + aa.abs().toString());
//ceil() 帶小數(shù)就向前進一位取大于或者等于表達式的最小整數(shù)
num h = 8.3;
num i = h.ceil();
print(i);
//floor()舍掉小數(shù)位 不管他多大
num j = 10.9;
num k = j.floor();
//round()四舍五入
- boolean
- 布爾 關(guān)鍵字 bool 值 true 或者 false
- 布爾類型的合法值只有兩個 true 和 false 在條件判斷語句中dart不會對條件語句進行類型轉(zhuǎn)換
- 與其他語言不同 例如 JavaScript 中 布爾是非空都為true dart中只有值為true才可以 比如就算一個字符串不是空 但是他的返回值不是bool值 所以是false
bool value = true;
// bool value2 = 'asda';//不合法
bool value2 = false;
if(value){
print(value);
}
四. Dart集合
- List集合(數(shù)組)
//第一種定義List的方式
var list222 = ["asdsa","asdasd","asdsadff"];
list222.length; 獲取長度
list222[0];獲取第一個值
//第二種定義List的方式
var list111 = List();
list111.add('asdsdddda');//增加新值
list111.addAll(['hahah','asdasd']); 可以添加新的數(shù)組
//在定義List時 直接指定其類型
var List2223 = List<String>();//定義了一個只能放String類型的數(shù)組 調(diào)用其構(gòu)造函數(shù)創(chuàng)建數(shù)組
//數(shù)組 里面的元素(值)可以重復 值的類型可以不同
List list1 = [1,2,3,4,5,6,7,8];
List list2 = [1,true,'qwe',1];
- List里面常用的屬性和方法 Map Set差不多通用
//常用屬性
length 長度
reversed 數(shù)組翻轉(zhuǎn) 對列表倒序排序
isEmpty 是否為空
isNoTEmpty 是否不為空
//常用方法
add 增加元素 增加一個
addAll 拼接數(shù)組
indexOf 查找數(shù)據(jù) 傳入具體值 查到了返回元素所在位置索引 查找不到返回-1
remove 刪除 傳入具體值
removeAt 刪除 傳入索引值
fillRange 修改數(shù)據(jù) 傳入開始索引和結(jié)束索引 然后傳入要添加的值(1,10 ,'修改的值')温鸽;
insert(index,value); 指定位置插值 (1 要添加的位置在索引為1的元素前添加 保屯,’要添加的值‘)
insertAll(index,List); 指定位置插入List 和上面的一樣 只是傳入的是數(shù)組
toList() 其他類型轉(zhuǎn)換為List
join() List轉(zhuǎn)換為字符串 傳入變成字符串后的分割元素之間的符號
split() 字符串轉(zhuǎn)換為List 傳入通過哪些符號來分割字符串 變成List
forEach
map
where
any
every
-
Maps(字典) 也可以叫對象是無序的鍵值對
- 常用屬性:
- keys 獲取所以key值
- values 獲取所有Value值
- isEmpty 是否為空
- isNotEmpty是否不為空
- 常用方法
- remove(key) 刪除指定key的數(shù)據(jù)
- addAll({....}) 合并映射字典 給映射增加屬性
- containsValue 查看字典內(nèi)是否有某個值 返回true false
- 常用屬性:
//將key和Value相關(guān)聯(lián)的對象
//key和Value都可以是任何對象
//定義方式 map字面量來定義
var person = {
"name" : "zhangsna",
"age" : 20,
"work" : ['haha','hehe']
};
//可以直接添加或者修改值
person["name"]; //取值
var per = Map();
// Map類型
Map dic = {'name': 'zhangsna', 'age': 20};
Map dic2 = new Map();//dart2.0版本后可以不用寫new關(guān)鍵字
var dic3 = new Map();
//從map中取值 如果map對象中沒有對應(yīng)的鍵 返回null
print(tempMap2['sencond'].toString());
// .length 取得map對象的長度
-
Set
集合里面的值不可以重復,值的類型必須統(tǒng)一涤垫。最主要的功能是去除數(shù)組中重復的內(nèi)容姑尺。Set是沒有順序且不能重復的集合,所以不能通過索引去獲取值蝠猬。
定義有兩種形式 Set字面量 Set類型
var s = Set();
var set1 = {'value1','value2'};//Set字面量
//Set類型
//變量類型 決定
Set set2 = {};
//類型參數(shù)
var set3 = <String>{};//指定元素為String類型的Set集合
Set<String> set4 = {};
//.add()添加至到集合
set4.add('value1');
print(set4);
// .addAll 將元素為同類型的集合添加到現(xiàn)有集合
set4.addAll(set1);
print(set4);
// .length 得到集合的長度 里面多少個元素或者值
print(set4.length.toString());
-
常用方法
①. forEach() 傳入函數(shù)表達式 遍歷
list.forEach((value){ 遍歷數(shù)組 會把數(shù)組的每一個元素賦值給Value
print("$value");
});
②. map方法和JS里map方法很像切蟋,遍歷一個數(shù)組同時返回一個數(shù)組,遍歷同時會給出每個元素value吱雏。
var newList = lsit.map((value){
return value*2;
})
③. where方法遍歷數(shù)組得到元素同時可以加判斷語句
var newList = list.where((value){
return value>5;
})
④. any方法遍歷一個數(shù)組是否存在某個元素或者符合某些條件 返回 true false 只要集合里面有滿足條件就返回true
var newList = list.any((value){
return value>5;
})
⑤. every方法遍歷一個數(shù)組是否存在某個元素 或者 符合某些條件 每一個都滿足條件返回true否則返回false
var newList = list.every((value){
return value>5;
})
五. 運算符
- 算術(shù)運算符 + 敦姻、- 、* 歧杏、/ 镰惦、~/取整 、 %取余犬绒、 ++ 旺入、 -- 、 += 凯力、+-
a = b++; 會先把b賦值給a 然后在加 ++ -- 標識自增 自減 1
a = ++b; 把b加上1 在賦值給a
//在賦值運算里面如果++ -- 寫在前面 這個時候先運算 在賦值 如果++ -- 寫在后面 先賦值后運算
int aaaa = 13;
int bbbb = 5;
print(aaaa+bbbb);
print(aaaa-bbbb);
print(aaaa*bbbb);
print(aaaa/bbbb);
print(aaaa~/bbbb);
print(aaaa%bbbb);
- 關(guān)系運算符 == != > < >= <= 二元運算符
print(aaaa == bbbb);
print(aaaa != bbbb);
print(aaaa > bbbb);
print(aaaa < bbbb);
print(aaaa <= bbbb);
print(aaaa >= bbbb);
-
邏輯運算符 ! 取反 && 并且 || 與
- && 并且 條件全部為true 為true 否則false
- || 或者 或 全部為false 為false 否則 true
基礎(chǔ)賦值運算符 = ??= 賦值
b ??= 23; 表示如果b為空的話把23賦值給b
復合賦值運算符 += 茵瘾、 -= 、 *= 咐鹤、 %= 拗秘、 ~/=
三目運算符 它是唯一有3個操作數(shù)的運算符,也叫三元運算符祈惶。一般來說雕旨,三目運算符的結(jié)合性是右結(jié)合的。
var flag = true;
var ccc = flag ? '正確' : '錯誤';
- ?? 運算符
var aaa = 222;
var bbb = a ?? 333; //當a的值為空的時候把333賦值給bbb
六. 類型轉(zhuǎn)換
- Number和String類型之間的轉(zhuǎn)換
- Number類型轉(zhuǎn)換為String類型用toSting()
- String轉(zhuǎn)換為Number 用parse 通過int調(diào)用parse函數(shù)把要轉(zhuǎn)換的字符串傳進去
String ahahah = '123';
var nnnnn = int.parse(ahahah);
var nnnnn = double.parse(ahahah);//轉(zhuǎn)換為double
//如果傳入的值為空 可以通過 try catch來判斷
try{
var nnnnn = int.parse(ahahah);
}catch (err){
print('error');
//如果轉(zhuǎn)換失敗會跳到catch中
}
var aaasaa = 222;
aaasaa.isNaN //判斷是否為空
print(aaaa.toString());
七. 循環(huán)語句 流程控制語句(控制流)
- for循環(huán)
- 流程:
- 聲明變量int i = 0
- 判斷i <= 100
- print(i);
- i++
5.從第二步再來捧请,直到判斷為false
for(int i = 0 ; i <= 100 ; i++ ){
print(i);
}
// 打印0到50所有的偶數(shù)
for(int i = 0 ; i <= 50 ; i++ ){
if(i % 2 == 0){
print(i);
}
}
//求1+2+3+4+5+++100的和
var sum = 0;
for(int i = 1 ; i <= 100 ; i++ ){
sum += i;
}
//5050;
-
while 循環(huán) 和 do while 循環(huán)
- 語法格式
- 注意點
- 最后的分號不要忘記
- 循環(huán)條件中使用的變量需要經(jīng)過初始化
- 循環(huán)體中凡涩,應(yīng)有結(jié)束循環(huán)的條件否則會死循環(huán)
- while語句可能一次都不執(zhí)行 do while 肯定會執(zhí)行一次
- 不同點 第一次循環(huán)條件不成立的情況下 while不執(zhí)行循環(huán)體 do while肯定會執(zhí)行一次
while(表達式/循環(huán)條件){
循環(huán)體
}
do{
語句/循環(huán)體
}while(表達式/循環(huán)條件)
if else
switch case
-
break語句
- 在switch語句中使流程跳出switch結(jié)構(gòu)
- 在循環(huán)語句中使流程跳出當前循環(huán),遇到break 循環(huán)終止疹蛉,后面的代碼不會執(zhí)行
break語句注意點
1.如果在循環(huán)中已經(jīng)執(zhí)行了break語句活箕,就不能執(zhí)行循環(huán)體中位于break后的語句。
2.在多層循環(huán)中可款,一個break語句只能向外跳出一層育韩。
3.break可以用在switch case 中也可以用在for循環(huán)和while循環(huán)中克蚂。-
ontinue語句
- [注]只能在循環(huán)語句中使用,使本次循環(huán)結(jié)束座慰,既跳過循環(huán)體重下面尚未執(zhí)行的語句陨舱,接著進行下continue可以用在for循環(huán)以及while循環(huán)中,但是不建議用在while循環(huán)中版仔,不小心容易死循環(huán)
八. Dart函數(shù)
dart中的函數(shù) 函數(shù)的定義 可選參數(shù) 默認參數(shù) 命名參數(shù) 箭頭函數(shù) 匿名函數(shù) 閉包等 函數(shù)也叫方法 在類外面叫函數(shù) 在類內(nèi)部叫方法 這個都無所謂 都可以叫函數(shù) 也可以叫方法
- 自定義方法函數(shù):
自定義方法的基本格式
返回類型 方法名稱(形式參數(shù)1游盲,形式參數(shù)2,......){
方法體 具體執(zhí)行邏輯
return 返回值;
}
print();//內(nèi)置方法/函數(shù)
- 定義一個帶可選參數(shù)的方法
String method (String name ,[int age,String sex]){
//形參 可選參數(shù)放到參數(shù)后面 用[]中括號包裹 用蛮粮,逗號隔開
}
- 定義一個帶默認參數(shù)的方法
String method (String name ,[String sex = '男',int age]){
//形參 如果有默認參數(shù) 建議放到 不帶默認參數(shù)的可選參數(shù)前面
}
- 定義一個命名參數(shù)的方法
String method (String name ,{String sex = '男',int age}){
//參數(shù)帶名稱的參數(shù) 需要用大括號包裹{}并且里面也可以設(shè)置默認參數(shù)
}
- 實現(xiàn)一個把函數(shù)當做參數(shù)的方法
fn1(){
print('fn1');
}
fn2(fn){
fn();
}
fn2(fn1);
//把方法函數(shù)fan1當做另一個方法fan2的形式參數(shù)傳進去 然后執(zhí)行
- 匿名函數(shù) 沒有名字的函數(shù)
var fn = (){//沒有方法名稱
print('我是一個匿名方法');
}//直接通過變量fn調(diào)用方法
var printNumm = (){
//表示把一個函數(shù)賦值給了printNumm這個變量 調(diào)用方式和普通調(diào)用方法一樣 傳值方式和普通方法一樣
}
- 箭頭函數(shù) 箭頭函數(shù)后面只能寫一句代碼
list.forEach((valye) => print(value));
list.forEach((value) => {//里面也只能寫一句代碼
print(value)//不用寫分號
})
- 自執(zhí)行方法 不主動去調(diào)用 方法自己去執(zhí)行
((int n){
//方法在創(chuàng)建好后會自動執(zhí)行 因為方法后面有括號會直接調(diào)用這個方法 可以傳入?yún)?shù) 和 接收參數(shù) 還可以指定類型
print('我是自執(zhí)行方法');
})(12);
//就相當于在函數(shù)外面包裹了一個函數(shù)
- 方法的遞歸 一個方法可以調(diào)用自己 記得寫判斷語句 當符合條件后跳出 否則死循環(huán)
var sum = 1;
fn(int n ){
sum*=n;
if(n == 1){
return;
}
fn(n-1);//關(guān)鍵這句 在符合條件后在此執(zhí)行當前方法
}
fn(10);
-
閉包:函數(shù)嵌套函數(shù)益缎,內(nèi)部函數(shù)會調(diào)用外部函數(shù)的變量或參數(shù).
- 全局變量特點:全局變量常駐內(nèi)存,全局變量污染全局
- 局部變量的特點:不會常駐內(nèi)存 會被垃圾回收機制回收然想,不會污染全局
通過閉包可以實現(xiàn):常駐內(nèi)存莺奔、不污染全局,產(chǎn)生了閉包变泄,閉包可以解決這個問題令哟。
閉包寫法:函數(shù)嵌套函數(shù),并return 里面的函數(shù)妨蛹,這樣就行成了閉包
fn(){
var a = 123; /*不會污染全局 常駐內(nèi)存 *//
return (){
a++;
print(a);
}
}
print(fn());
九. 類
dart所有的東西都是對象屏富,所有的對象都繼承自O(shè)bject類。是一門使用類和單繼承的面向?qū)ο笳Z言蛙卤,所有的對象都是類的實例狠半,并且所有的類都是Object的子類。
一個類通常由屬相和方法組成
1. 定義Person類
class Person{//類名首字母大寫
String name = '張三';
int age = 23;
//dart里面的構(gòu)造函數(shù)可以寫多個但是默認構(gòu)造函數(shù)只能有一個
Person(String name,int age){
this.name = name;
this.age = age;
print('這是構(gòu)造函數(shù)里面的內(nèi)容颤难,這個方法在實例化的時候觸發(fā)')
}
//默認構(gòu)造函數(shù)簡寫
Person(this.name,this.age);
//命名構(gòu)造函數(shù) 可以有多個
Person.now(){
print('我是命名構(gòu)造函數(shù)');
}
void getInfo(){
print("${this.name}--$age");//this指當前類 類似self 通過this.需要用{}大括號包裹
}
}
2. 實例化類
var p1 = Person();//2.0.0后不用new關(guān)鍵字 寫也可以 推薦不寫
Person p2 = Person();//默認實例化類的時候調(diào)用的是默認構(gòu)造函數(shù)
Person p3 = Person.now();//命名構(gòu)造函數(shù)
var time = DateTime.now(); //實例化datetime 調(diào)用它的命名構(gòu)造函數(shù)
//dart和其他面向?qū)ο笳Z言不一樣 dart中沒有public private protected這些訪問修飾符
但是我們可以使用 “_” 下劃線 把一個屬性或者方法定義成私有
String _name;//私有屬性 私有屬性可以通過共有的方法來訪問 間接訪問私有屬性
_run(){//私有方法
print('這是一個私有方法');//也可以通過公有方法來間接調(diào)用私有方法
}
alert(){
this._run();//通過公有方法訪問私有方法 私有的不能直接訪問
}
3. 類中的getter和setter修飾符
get 名稱{ //getter方法 也就方法獲取數(shù)據(jù)
return "返回值"
}
set 名稱(形式參數(shù)){
//參數(shù)名稱 = 形式參數(shù)神年;
}
4. 類中的初始化列表
dart中我們也可以在構(gòu)造函數(shù)體運行之前初始化實例變量
int height;
int width
Rect():height = 2 , width= 3{//在實例化之前的操作
}
5. 靜態(tài)成員
dart類中的靜態(tài)成員:
- 使用static 關(guān)鍵字來實現(xiàn)類級別的變量和函數(shù)
- 靜態(tài)方法不能訪問非靜態(tài)成員,非靜態(tài)方法可以訪問靜態(tài)成員
- 靜態(tài)方法成員變量不能在通過類的實例化對象訪問 直接通過類來訪問
static String name = "zhangsan";
static void show(){
}
void getInfo(){//非靜態(tài)方法可以訪問靜態(tài)成員以及非靜態(tài)成員
}
6. dart中的對象操作符
- ? 條件運算符
- as 類型轉(zhuǎn)換
- is 類型判斷
- .. 級聯(lián)操作(連綴)
p1?.方法 如果p1對象不存在會自動返回 如果存在會訪問方法
(p1 as Person).方法或者屬性 //類型轉(zhuǎn)換 轉(zhuǎn)換為自己需要的類型
Person p1 = Person();
p1..name = "hhhh";
..age = 35;//連綴操作符 訪問屬性或者方法不用對象名可以直接訪問
7. dart中的類的繼承
通過super關(guān)鍵字來繼承父類的屬性和方法
重寫父類方法是時@override關(guān)鍵字 建議加 可以不加
super.父類里面的方法 通過super調(diào)用父類的方法
- 子類使用extends類關(guān)鍵字來繼承父類
- 子類會集成父類中可見的屬性和方法 但是不會繼承構(gòu)造函數(shù)
- 子類能重寫父類的方法getter和setter方法
8. dart中的抽象類 多態(tài) 和接口
dart抽象類主要用于定義標準行嗤,子類可以繼承抽象類已日,可以實現(xiàn)抽象類的接口
- 抽象類通過abstract關(guān)鍵字來定義
- dart中的抽象方法不能用abstract聲明,dart中沒有方法體的方法我們稱為抽象方法
- 如果子類繼承抽象類必須得實現(xiàn)里面的抽象方法
- 如果把抽象類當做接口實現(xiàn)的話必須得實現(xiàn)抽象類里面定義的所有屬性和方法
- 抽象類不能被實例化栅屏,只有繼承它的子類可以
繼承抽象類extends和implements關(guān)鍵字的區(qū)別
- 如果復用抽象類的方法飘千,并且要用抽象方法約束自類的話我們就要用extends繼承抽象類
- 如果只是把抽象類當做標準的話我們就用implements實現(xiàn)抽象類、
接口:就是約定規(guī)范
首先dart的接口沒有interface關(guān)鍵字定義接口既琴,而是普通類或者抽象類都可以作為接口被實現(xiàn)
同樣適用implements關(guān)鍵字進行實現(xiàn)
但是dart的接口有點奇怪如果實現(xiàn)的類是普通類 會將普通類和抽象中的屬性的方法全部需要重寫一遍
而因為抽象類可以定義抽象方法,普通類不可以泡嘴,所以一般如果要實現(xiàn)像Java接口那樣的方式甫恩,一般會使用抽象類。
建議使用抽象類定義接口
abstract class Db{
add();//只寫方法不實現(xiàn) 繼承它的子類需要實現(xiàn)它的方法屬性
}
class Mysql implements Db{
@override
add(){
}
}
dart中一個類實現(xiàn)多個接口 以及dart中的Mixins混入
abstract class a{
add();//只寫方法不實現(xiàn) 繼承它的子類需要實現(xiàn)它的方法屬性
}
abstract class b{
remove();//只寫方法不實現(xiàn) 繼承它的子類需要實現(xiàn)它的方法屬性
}
class implements a,b{
//需要實現(xiàn)上面?zhèn)z個抽象類的方法和屬性 這叫一個類實現(xiàn)多個接口
}
Mixins的中文意思是混入 就是類中混入其他功能酌予,在dart中可以使用mixins實現(xiàn)類似多繼承的功能磺箕,因為mixins使用條件 隨著dart的版本一直在變 這里講的是dart2.x中使用mixins的條件
- 作為mixins的類只能繼承自object 不能繼承其他類
- 作為mixins的類不能有構(gòu)造函數(shù)
- 一個類可以mixins多個mixins類
mixins不是繼承也不是接口 而是一種全新的特性奖慌,mixins的實例類型就是其超類的子類型 c 混入a b 就是ab的子類型。通過with關(guān)鍵字實現(xiàn)class c with a,b{}
c繼承了a和b class c extends Person with a松靡,b {}
c繼承于Person類同時混入了a b 如果繼承的有同樣的方法和屬性 后面的會覆蓋前面的
9. 泛型 泛型方法 泛型類 泛型接口
通俗理解:泛型就是解決 類 接口 方法的復用性简僧,以及對不特定數(shù)據(jù)類型的支持(類型效驗)
泛型一般在方法前面加T 啥都行 說明是泛型
①. 泛型方法
T getDate<T>(T value){
return value;
}
調(diào)用:
一般 getDate(123) 這個沒有類型校驗 傳啥返回啥。
類型校驗 getData<String>('123213'); 這個String會傳給尖括號的T代表這個方法的返回值是String 接收值也是String
②. 泛型類
class Person<T>{
List list = List<T>();
void ad(T value){
this.list.add(value);
}
}
dart中的泛型接口:
- 定義一個泛型接口 約束實現(xiàn)它的子類必須有g(shù)etByKey(Key) 和 setBuKey(key雕欺,value)
2.要求setByKey的時候value的類型和實例化子類的時候指定的類型一致
abstract class Cache<T>{
getByKey(steing key);
void setByKey(string key ,T value);
}
class FlieCache<T> implements Cache<t>{
//繼承泛型類 把當前類定義的泛型<T>傳給父類的泛型<T>
void setByKey(string key ,T value){
}
}
③. async和await
- 只有async方法才能使用await關(guān)鍵字調(diào)用方法岛马,如果調(diào)用別的async方法必須使用await關(guān)鍵字
- async是讓方法變成異步
- await是等待異步方法執(zhí)行完成
記錄:
函數(shù)如果有一行的話可以使用箭頭函數(shù) 只要超過一行就不能使用箭頭函數(shù) (value) => print(value);
dart中所有的類都繼承于Object類
$ 符 字符串插值運算符 $+變量名
//引入別的類
import 'package:async/async.dart';
Rune 符號文件 用來表達Unicode字符
Unicode為所有世界寫作系統(tǒng)中使用的每個字母、數(shù)字和符號定義了唯一的數(shù)值屠列。
Unicode采用UTF-32位編碼 dart采用了UTF-64編碼
為了在字符串中表達32位的Unicode值需要用到特殊語法
\uXXXX 以\u開始后面跟著4個十六進制數(shù)(XXXX) 啦逆, x的取值范圍是0到f
var tempStr = '\u0F00';
print(tempStr);
當?shù)街付ǘ嘤诨蛘呱儆?個十六進制數(shù)字是,使用{}包裹該值
var smeil = '\u{1F600}';
print(smeil);
全局函數(shù) 可以在main方法中調(diào)用 全局作用域 方法參數(shù)被稱為形式參數(shù) 形參 調(diào)用方法傳入的參數(shù)被稱為實際參數(shù) 實參
//自定義方法
void printInfo(){
print('我是一個自定義方法');
int getNum(){//方法里面還可以嵌套方法 一個返回值為int的方法 這個方法只能在 當前函數(shù)體內(nèi)調(diào)用 局部作用域
var myNum = 111;
return myNum;
}
}