Dart 基础语法-函数

4,648 阅读1分钟

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();