函数
- Dart 是一门真正面向对象的语言, 甚至其中的函数也是对象,并且有它的类型
Funcation
。- 这也意味着函数可以被赋值给变量或者作为参数传递给其他函数。 也可以把 Dart 类的实例当做方法来调用
main() 函数
任何应用都必须有一个顶级
main()
函数,作为应用服务的入口。main()
函数返回值为空,参数为一个可选的List<String>
。
函数声明
-
bool isNoble(int number){a // 函数体 return number>0; } // bool返回值 当返回值为空可以写void 或者省略不写 若不为空则需要指定返回类型 比如int string bool等 //isNoble 函数名称 //int 参数类型 //number 参数
-
函数简写
函数参数
dart 除了普通的参数之外还支持可选参数 以及设置可选参数默认值
dart 参数如果不指定参数类型 示例
test(param)
那么param
将是dynamic
类型
可选参数
可选参数可以是命名参数或者位置参数,但一个参数只能选择其中一种方式修饰
命名可选参数
-
可选的命名参数调用函数时可以指定命名参数
-
与顺序无关 在调用函数的时候需要指明参数名 例如
paramName:value
-
定义函数参数时用
{}
包裹 例如{param1,param2...}
-
可以指定参数类型 也可以不指定类型 例如
{params,int param1}
-
默认值旧版本用
:
新版本支持=
推荐使用=
没有赋值 值为null 例如:{param1="nike",int param2}
-
@required
修饰的参数为必传参数 -
示例
-
void enableFlags({bool param1, String param2 = '2', @required param3}) { if (param1) { print(param2 + param3.toString()); } }
-
-
调用
-
/*可选命名参数*/ enableFlags(param1: true, param3: 3); enableFlags(param1: true, param2: 'test', param3: 3);
-
位置可选参数
-
参数值依次赋值 与顺序有关
-
定义函数参数时用
[]
包裹 -
同样可以指定参数类型也可以不指定参数类型
-
默认值用
=
没有赋值 值为null -
示例
-
void enableFlags2(bool param1, [String param2 = 'Test2', param3, param4]) { if (param1 is bool) { print(param2 + param3.toString() + param4.toString()); } }
-
-
调用
-
/*可选的位置参数*/ enableFlags2(true, 'new', 3); enableFlags2(true, 'new', 3, 4);
-
参数默认值
- 默认值用
=
没有赋值 值为null 上面解释有
可选参数示例
可传递List map 作为可选参数
const 表示编译时常量 故名思意 只有编译前可以改变值 编译后无法改变
-
函数
-
void doStuff( {List<int> list = const [1, 2, 3], Map<String, String> gifts = const { 'first': 'paper', 'secend': 'cotton', 'third': 'leather' }}) { print('list: $list'); print('gifts:$gifts'); }
-
-
调用方式
-
/*可传递List map*/ List<int> list = [4, 5, 6]; Map<String, String> map = { 'one': 'param1', 'two': 'param2', 'three': 'param3' }; doStuff(list: list, gifts: map);
-
函数一等公民
-
函数也是对象 可以赋值给变量
-
var sayHelloN = (name) => 'hello $name';// 后面函数就是匿名函数
-
-
可以将函数作为别的函数的参数
-
void printElement(int element) { print(element); } var listN = ['apples', 'banners', 'orange']; listN.forEach(printElement(element));
-
匿名函数
没有名字的函数就称为匿名函数,有时候也被称为 lambda 或者 closure 。
-
匿名函数可以赋值到一个变量中
-
var sayHelloN = (name) => 'hello $name';// 后面函数就是匿名函数
-
-
函数定义
-
匿名函数和命名函数看起来类似— 在括号之间可以定义一些参数或可选参数,参数使用逗号分割。
-
//后面大括号中的代码为函数体: ([[Type] param1[, …]]) { codeBlock; };
-
-
示例 定义一个五类型参数
item
的匿名函数,list每个元素调用该函数 打印元素位置和字符串-
var listN = ['apples', 'banners', 'orange']; listN.forEach((item) { print('${listN.indexOf(item)}:$item'); }); listN.forEach((item) => print('${listN.indexOf(item)}:$item')); //用=>写
-
函数闭包
-
闭包 即一个函数对象。即使函数对象的调用在它原始作用域之外, 依然能够访问在它词法作用域内的变量。
-
函数可以风i定义到它作用域内的变量
-
示例
-
makeAdder()
捕获了变量addBy
。 无论在什么时候执行返回函数,函数都会使用捕获的addBy
变量。-
/// 返回一个函数,返回的函数参数与 [addBy] 相加。 Function makeAdder(num addBy) { return (num i) => addBy + i; } void main() { // 创建一个加 2 的函数。 var add2 = makeAdder(2); // 创建一个加 4 的函数。 var add4 = makeAdder(4); assert(add2(3) == 5); assert(add4(3) == 7); }
-
-
函数返回值
所有函数都会返回一个值。 如果没有明确指定返回值, 函数体会被隐式的添加 return null;
语句。
foo() {}
assert(foo() == null);
测试函数是否相等
//测试函数是否相等
//下面是顶级函数,静态方法和示例方法相等性的测试示//例:
void foo() {} // 顶级函数
class A {
static void bar() {} // 静态方法
void baz() {} // 示例方法
}
void main() {
var x;
// 比较顶级函数。
x = foo;
assert(foo == x);
// 比较静态方法。
x = A.bar;
assert(A.bar == x);
// 比较实例方法。
var v = A(); // A的1号实例
var w = A(); // A的2号实例
var y = w;
x = w.baz;
// 两个闭包引用的同一实例(2号),
// 所以它们相等。
assert(y.baz == x);
// 两个闭包引用的非同一个实例,
// 所以它们不相等。
assert(v.baz != w.baz);
}