8、函数
Dart是一门面向对象的语言,所以函数也是对象,并且函数的类型是Function。
1、函数的基本使用
函数的参数可以分成两类: 必须参数和可选参数
可选参数可以分为 命名可选参数 和 位置可选参数
定义方式:
命名可选参数: {param1, param2, ...}
位置可选参数: [param1, param2, ...]
1、main函数
每个应用程序都必须有一个顶层的main函数。它是一个应用程序的切入口。改main函数返回void并具有List的可选参数
void main() {
runApp(MyApp());
}
2、可选参数
可选的命名参数,即使不传递这些参数也是可以的。 在定义函数时,使用{param1,parqm2,...}指定命名参数。
void userSettings({int age,String name}){
if(age != null) {
print('my age is ${age}');
}
if(name != null) {
print('my name is ${name}');
}
}
上面函数中,我们可以传递age、name这两个参数,绘制其一,或者一个都不传递
3、必传参数
有时候,我们在调用函数的时候,必须传入一些参数,这个时候就用到了@required来修饰。使用@required有利于静态代码分析器进行检查
void userSettings({@required int age,String name}){
if(age != null) {
print('my age is ${age}');
}
if(name != null) {
print('my name is ${name}');
}
}
4、可选的位置参数
使用[]把目标标记为可选的位置参数
void userSettings(int age, String name, [String interests]){
if(age != null) {
print('my age is ${age}');
}
if(name != null) {
print('my name is ${name}');
}
if(interests != null){
print('兴趣是${interests}');
}
}
5、默认参数
默认值是编译时常量,在函数的参数后面使用 = 为参数赋值
- 参数可以有默认值, 在不传入的情况下, 使用默认值
- 注意, 只有可选参数才可以有默认值, 必须参数不能有默认值
void userSettings(int age, String name, [String interests,String sex = "男"]){
if(age != null) {
print('my age is ${age}');
}
if(name != null) {
print('my name is ${name}');
}
if(interests != null){
print('兴趣是${interests}');
}
if(sex != null){
print('性别${sex}');
}
}
6、函数作为参数
executeFunction(fn, [args]) {
if (fn != null) {
return fn(args);
}
}
7、函数作为变量
var say = (name){
pring(name);
}
say('小明');
2、箭头函数
List l1 = [1, 2];
l1.forEach((item) {
print(item);
});
l1.forEach((item) => print(item));
箭头函数只能有一行,可以省略大括号 在 map 方法中使用箭头函数:
var l2 = l1.map((item) {
return item % 2 == 0 ? item * 2 : item;
});
print(l2.toList());
var l3 = l1.map((item) => item % 2 == 0 ? item * 2 : item);
print(l3);
3、匿名函数
某些情况下,给函数命名太麻烦了,我们可以使用没有名字的函数,这种函数可以被称之为匿名函数( anonymous function),也可以叫lambda或者closure。
main(List<String> args) {
// 1.定义数组
var movies = ['盗梦空间', '星际穿越', '少年派', '大话西游'];
// 2.使用forEach遍历: 有名字的函数
printElement(item) {
print(item);
}
movies.forEach(printElement);
// 3.使用forEach遍历: 匿名函数
movies.forEach((item) {
print(item);
});
movies.forEach((item) => print(item));
}
4、立即执行函数
// 立即执行方法
((name) {
print('my name is ${name}');
})('postbird');
5、闭包
// 闭包
Function getA() {
int a = 0;
return () {
a++;
print(a);
};
}
Function b = getA();
b();
b();