方法定义
-
方法包含:返回类型、方法名、传入参数、方法体、返回值
返回类型 方法名(参数1,参数2...) { 方法体... return 返回值 }
方法特性
方法也是对象,并且有具体类型的Function
方法没有返回值。如果没有指定,默认return null
-
main方法,没有返回值一个参数
void main(List<String> args) { print(args); //[] }
-
有返回值、多个参数
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 }
-
返回类型、参数类型都可以省略
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 }
可选参数
可选命名参数:{param1,param2}
-
可选命名参数可以不传值
//可选命名参数,后面两个参数可以不传 printOptionParams(String name,{int age, String gender}) { print('name=$name,age=$age,gender=$gender'); } void main() { printOptionParams('王五'); //name=王五,age=null,gender=null //可选参数的条用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=男 }
可选位置参数:[param1,param2]
可选位置参数可以不传,但是参数的位置不能变
//可选位置参数,后面两个参数可以不传 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
//可选参数的条用param:value
printOptionParams('王五',20); //name=王五,age=20,gender=null
printOptionParams('王五',20,'男'); //name=王五,age=20,gender=男
//必须按照位置来传参数,int String不能调用位置
printOptionParams('王五','男', 20); //报错
}
-
如果存在具体参数,可选参数必选在具体参数的后面
//可选位置参数在具体参数前面 printOptionParams([int age, String gender],String name) { print('name=$name,age=$age,gender=$gender'); } //方法调用的时候会报错 //可选命名参数在具体参数前面 printOptionParams({int age, String gender},String name]) { print('name=$name,age=$age,gender=$gender'); } //方法调用的时候会报错
默认参数
使用 = 在可选参数指定默认值
默认值只能是编译器的常量
-
默认参数,方法调用没给可选参数赋值话,赋值默认值
printOptionParams(String name,{int age=30, String gender='女'}) { print('name=$name,age=$age,gender=$gender'); } void main() { printOptionParams('王五'); //name=王五,age=30,gender=女 //可选参数的条用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=男 } //默认参数,方法调用没给位置参数赋值话,赋值默认值 printOptionParams(String name,[int age=30, String gender = '女']) { print('name=$name,age=$age,gender=$gender'); } void main() { printOptionParams('王五'); //name=王五,age=30,gender=女 //位置参数赋值的顺序不能变 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 }
-
方法可作为参数传递给其他方法
// times方法 String times(str) { return str*3; } //把times方法当做参数,返回的也是一个 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']; //方法作为参数时候不应该有() listTimes(list,times); /* hhh iii */ }
匿名方法
-
匿名方法定义
(参数1,参数2) { 方法体... return 返回值 }
可赋值给变量,通过变量进行调节
-
匿名方法不能放在外面单独声明,要是方法内声明
var fuc = (str) { print(str); }; fuc(30);
-
可在其他方法中直接调用或者传递给其他方法
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']; //方法作为参数时候不应该有() listTimes(list,(str){return str*3}); /* hhh iii */ }
闭包
- 闭包是一个方法也是对象(dart中一切都是对象)
- 闭包定义在其他方法内部
- 闭包能够访问外部方法内的局部变量,并持有其状态(这是闭包最大的作用,可以通过闭包的方式,将其暴露出去,提供给外部访问)
void main() {
//func持有count的状态
var func = a();
//每次调用count并没有每次初始化为0
//从打印结果来看,func持有count的状态
//我们无法直接通过操作count来改变,可以通过闭包的方式,将其暴露出去,使得外部可以访问
func(); //1
func(); //2
func(); //3
}
// 声明一个无返回值类型、无参数的函数
a() {
//count是a的局部变量
int count = 0;
// 内部声明一个函数 : 闭包
printCount() {
// 内部可以访问外部方法内的局部变量 count
count += 1;
print(count);
}
// 返回闭包
return printCount;
}
闭包的要素:
首先声明一个无返回值、无参数的函数
其次在函数内有局部变量
然后在声明一个闭包函数,闭包函数调用局部变量并且持有局部变量的状态
返回闭包