# 函数

# 函数

# main() 函数

Dart支持top-level函数,就是main(),任何应用都必须拥有一个main()函数,默认返回值为空,参数为一个可选的 List<String>

void main(List<String> arguments){
  print(arguments);
}

我们在运行文件的时候,执行

dart index.dart 1 2 

这里文件名后面跟的1和2,就是两个参数

# 函数返回值

定义一个普通函数,下面的函数规定了参数的类型以及函数返回值的类型,都是String

String getColor(String color){
  return color;
}

所有的函数都有返回值,那么没有明确指定返回值的函数会在函数体的最后隐式的添加 return null ,则返回类型为void,表示空.

# 函数参数

函数除了上面提到的最普通的参数以外,还有一些其他的参数.比如:可选参数,默认参数等.其中可选参数又可以是命名参数或者位置参数,但一个参数只能选择其中一种方式修饰

# 命名可选参数

定义函数时,使用{param1, params2, ...}这样的形式. 调用函数时,使用指定命名参数 paramName: value 的形式.如{param1: true, param2 : 'test'},可以不按照顺序传入.

String getColor(String color,{double height}){
  print(color);
  print(height);
  return color;
}

getColor('red');
getColor('red',height:88.8);

使用 @required注解表示参数是必填的

String getColor(String color,{double height,  double width}){
  print(color);
  print(height);
  print(width);
  return color;
}

其中 required 被定义在 meta package.所以无论是直接引入,还是引入其他package,而那个package中输出了meta都可以. 直接引用:

import 'package:meta/meta.dart';

在Flutter中引入包后也可直接使用 @required 注解

import 'package:flutter/material.dart';

# 位置可选参数

定义函数时,将参数放到 [] 中来标记参数是可选的,如[param1, param2] 调用函数时,就是正常的fn('必选','可选1','可选2')这样的形式.必选参数放前面,可选参数放后面,且必须按照顺序传入.若其中某个不是最后的参数不存在的话,需传入null.

String getColor(String color,[double height]){
  print(color);
  print(height);
  return color;
}

getColor('red');
getColor('red',88.8);

# 默认参数

在定义的时候,可以提供参数默认值,但默认值只能是编译时常量.如果没有提供默认值的话,则默认是null

void getPerson(String name, {String gender='male'}){
  print('$name $gender');
}

getPerson('zhangsan');  // zhangsan male
getPerson('lisi',gender:'female');  // lisi female

listmap也可以作为默认值传递

void foo({
  List<int> list = const [1,2],
  Map<String, double> map = const {
    'height':180,
    'width':150
  }
}){
  print('list: $list');
  print('map: $map');
}
foo();

# 函数是一等对象

一个函数可以作为另一个函数的参数

void printEle(Object ele){
  print(ele);
}
List<Object> list = [1,'t',true];
list.forEach(printEle);

也可以将一个函数赋值给一个变量

var printEle = (ele) => print(ele);
List<Object> list = [1,'t',true];
list.forEach(printEle);

# 匿名函数

又叫lambda或者closure,修改上面的例子

List<Object> list = [1,'t',true];
list.forEach((item){
  print(item);
});