方法定義
-
方法包含:返回類型、方法名、傳入?yún)?shù)、方法體、返回值
返回類型 方法名(參數(shù)1,參數(shù)2...) { 方法體... return 返回值 }
方法特性
方法也是對象,并且有具體類型的Function
方法沒有返回值。如果沒有指定,默認return null
-
main方法,沒有返回值一個參數(shù)
void main(List<String> args) { print(args); //[] } -
有返回值、多個參數(shù)
String getStudent(String name, int age) { return 'name=$name,age=$age'; } void main(List<String> args) { String stu = getStudent('張三',30); print(stu);//name=張三,age=30 } -
返回類型、參數(shù)類型都可以省略
getStudent(name,age) { return ('name=$name,age=$age'); } void main() { String stu = getStudent('張三',30); print(stu);//name=張三,age=30 } -
箭頭語法:=>expr是{return expr;}縮寫。只是用一個表達式
//返回類型string 簡寫 getPerson(name,age) =>'name=$name, age=$age'; void main() { print(getPerson('李四', 30));;//name=李四,age=30 }
可選參數(shù)
可選命名參數(shù):{param1,param2}
-
可選命名參數(shù)可以不傳值
//可選命名參數(shù),后面兩個參數(shù)可以不傳 printOptionParams(String name,{int age, String gender}) { print('name=$name,age=$age,gender=$gender'); } void main() { printOptionParams('王五'); //name=王五,age=null,gender=null //可選參數(shù)的條用param:value printOptionParams('王五',age: 20); //name=王五,age=20,gender=null printOptionParams('王五',age: 20,gender: '男'); //name=王五,age=20,gender=男 printOptionParams('王五',gender: '男',age: 20); //name=王五,age=20,gender=男 } 可選位置參數(shù):[param1,param2]
可選位置參數(shù)可以不傳,但是參數(shù)的位置不能變
//可選位置參數(shù),后面兩個參數(shù)可以不傳 age gender位置不能互換
printOptionParams(String name,[int age, String gender]) {
print('name=$name,age=$age,gender=$gender');
}
void main(List<String> args) {
printOptionParams('王五'); //name=王五,age=null,gender=null
//可選參數(shù)的條用param:value
printOptionParams('王五',20); //name=王五,age=20,gender=null
printOptionParams('王五',20,'男'); //name=王五,age=20,gender=男
//必須按照位置來傳參數(shù),int String不能調(diào)用位置
printOptionParams('王五','男', 20); //報錯
}
-
如果存在具體參數(shù),可選參數(shù)必選在具體參數(shù)的后面
//可選位置參數(shù)在具體參數(shù)前面 printOptionParams([int age, String gender],String name) { print('name=$name,age=$age,gender=$gender'); } //方法調(diào)用的時候會報錯 //可選命名參數(shù)在具體參數(shù)前面 printOptionParams({int age, String gender},String name]) { print('name=$name,age=$age,gender=$gender'); } //方法調(diào)用的時候會報錯
默認參數(shù)
使用 = 在可選參數(shù)指定默認值
默認值只能是編譯器的常量
-
默認參數(shù),方法調(diào)用沒給可選參數(shù)賦值話,賦值默認值
printOptionParams(String name,{int age=30, String gender='女'}) { print('name=$name,age=$age,gender=$gender'); } void main() { printOptionParams('王五'); //name=王五,age=30,gender=女 //可選參數(shù)的條用param:value printOptionParams('王五',age: 20); //name=王五,age=20,gender=女 printOptionParams('王五',age: 20,gender: '男'); //name=王五,age=20,gender=男 printOptionParams('王五',gender: '男',age: 20); //name=王五,age=20,gender=男 } //默認參數(shù),方法調(diào)用沒給位置參數(shù)賦值話,賦值默認值 printOptionParams(String name,[int age=30, String gender = '女']) { print('name=$name,age=$age,gender=$gender'); } void main() { printOptionParams('王五'); //name=王五,age=30,gender=女 //位置參數(shù)賦值的順序不能變 printOptionParams('王五', 20); //name=王五,age=20,gender=女 printOptionParams('王五', 20, '男'); //name=王五,age=20,gender=男 }
方法對象
-
方法可作為對象賦值給其他變量
void printHello() { print('hello'); } void main() { var func = printHello; //也可以用Function 來聲明 //Function func = printHello; func(); //hello } -
方法可作為參數(shù)傳遞給其他方法
// times方法 String times(str) { return str*3; } //把times方法當做參數(shù),返回的也是一個 List listTimes (List list, String times(str)) { for (var i = 0; i < list.length; i++) { list[i] = times(list[i]); print(list[i]); } } void main() { var list = ['h','i']; //方法作為參數(shù)時候不應該有() listTimes(list,times); /* hhh iii */ }
匿名方法
-
匿名方法定義
(參數(shù)1,參數(shù)2) { 方法體... return 返回值 } 可賦值給變量,通過變量進行調(diào)節(jié)
-
匿名方法不能放在外面單獨聲明,要是方法內(nèi)聲明
var fuc = (str) { print(str); }; fuc(30); -
可在其他方法中直接調(diào)用或者傳遞給其他方法
List listTimes (List list, String times(str)) { for (var i = 0; i < list.length; i++) { list[i] = times(list[i]); print(list[i]); } } void main() { var list = ['h','i']; //方法作為參數(shù)時候不應該有() listTimes(list,(str){return str*3}); /* hhh iii */ }
閉包
- 閉包是一個方法也是對象(dart中一切都是對象)
- 閉包定義在其他方法內(nèi)部
- 閉包能夠訪問外部方法內(nèi)的局部變量,并持有其狀態(tài)(這是閉包最大的作用,可以通過閉包的方式,將其暴露出去,提供給外部訪問)
void main() {
//func持有count的狀態(tài)
var func = a();
//每次調(diào)用count并沒有每次初始化為0
//從打印結果來看,func持有count的狀態(tài)
//我們無法直接通過操作count來改變,可以通過閉包的方式,將其暴露出去,使得外部可以訪問
func(); //1
func(); //2
func(); //3
}
// 聲明一個無返回值類型、無參數(shù)的函數(shù)
a() {
//count是a的局部變量
int count = 0;
// 內(nèi)部聲明一個函數(shù) : 閉包
printCount() {
// 內(nèi)部可以訪問外部方法內(nèi)的局部變量 count
count += 1;
print(count);
}
// 返回閉包
return printCount;
}
閉包的要素:
首先聲明一個無返回值、無參數(shù)的函數(shù)
其次在函數(shù)內(nèi)有局部變量
然后在聲明一個閉包函數(shù),閉包函數(shù)調(diào)用局部變量并且持有局部變量的狀態(tài)
返回閉包